㈠ android 左右滑屏怎么实现 哪位大神教教我
代码如下:
package kexc.scroll;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.Scroller;
/**
* 仿Launcher中的WorkSapce,可以左右滑动切换屏幕的类
*
*/
public class ScrollLayout extends ViewGroup {
/*
* onMeasure方法在控件的父元素正要放置它的子控件时调用。它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——
* widthMeasureSpec和heightMeasureSpec。它们指明控件可获得的空间以及关于这个空间描述的元数据。
* 比返回一个结果要好的方法是你传递View的高度和宽度到setMeasuredDimension方法里。
* 一个MeasureSpec包含一个尺寸和模式。
* 有三种可能的模式:
* UNSPECIFIED:父布局没有给子布局任何限制,子布局可以任意大小。
* EXACTLY:父布局决定子布局的确切大小。不论子布局多大,它都必须限制在这个界限里。
* AT_MOST:子布局可以根据自己的大小选择任意大小。
*/
/*
* VelocityTracker类
*
* 功能: 根据触摸位置计算每像素的移动速率。
*
* 常用方法有:
*
* public void addMovement (MotionEvent ev) 功能:添加触摸对象MotionEvent , 用于计算触摸速率。
* public void computeCurrentVelocity (int units)
* 功能:以每像素units单位考核移动速率。额,其实我也不太懂,赋予值1000即可。 参照源码 该units的意思如下: 参数 units :
* The units you would like the velocity in. A value of 1 provides pixels
* per millisecond, 1000 provides pixels per second, etc. public float
* getXVelocity () 功能:获得X轴方向的移动速率。
*/
/*
* ViewConfiguration类
*
* 功能: 获得一些关于timeouts(时间)、sizes(大小)、distances(距离)的标准常量值 。
*
* 常用方法:
*
* public int getScaledEdgeSlop()
*
* 说明:获得一个触摸移动的最小像素值。也就是说,只有超过了这个值,才代表我们该滑屏处理了。
*
* public static int getLongPressTimeout()
*
* 说明:获得一个执行长按事件监听(onLongClickListener)的值。也就是说,对某个View按下触摸时,只有超过了
*
* 这个时间值在,才表示我们该对该View回调长按事件了;否则,小于这个时间点松开手指,只执行onClick监听
*/
private static final String TAG = "ScrollLayout";
private Scroller mScroller;
private VelocityTracker mVelocityTracker;
private int mCurScreen;//当前屏幕
private int mDefaultScreen = 0;
//两种状态: 是否处于滑屏状态
private static final int TOUCH_STATE_REST = 0;//静止状态
private static final int TOUCH_STATE_SCROLLING = 1;//滑屏状态
private static final int SNAP_VELOCITY = 600; //最小的滑动速率
private int mTouchState = TOUCH_STATE_REST;
private int mTouchSlop;// change 多少像素算是发生move操作
private float mLastMotionX;
private float mLastMotionY;
public ScrollLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
// TODO Auto-generated constructor stub
}
public ScrollLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
mScroller = new Scroller(context);
mCurScreen = mDefaultScreen;
//初始化一个最小滑动距离
mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
}
/**
* 生成view
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
if (changed) {
int childLeft = 0;
final int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
final View childView = getChildAt(i);
if (childView.getVisibility() != View.GONE) {
final int childWidth = childView.getMeasuredWidth();
childView.layout(childLeft, 0, childLeft + childWidth,
childView.getMeasuredHeight());
childLeft += childWidth;
}
}
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
Log.e(TAG, "onMeasure");
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final int width = MeasureSpec.getSize(widthMeasureSpec);
final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
if (widthMode != MeasureSpec.EXACTLY) {
throw new IllegalStateException(
"ScrollLayout only canmCurScreen run at EXACTLY mode!");
}
final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
if (heightMode != MeasureSpec.EXACTLY) {
throw new IllegalStateException(
"ScrollLayout only can run at EXACTLY mode!");
}
// The children are given the same width and height as the scrollLayout
final int count = getChildCount();
for (int i = 0; i < count; i++) {
getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
}
// Log.e(TAG, "moving to screen "+mCurScreen);
scrollTo(mCurScreen * width, 0);
}
/**
* According to the position of current layout scroll to the destination
* page.
*/
public void snapToDestination() {
// 判断是否超过下一屏的中间位置,如果达到就抵达下一屏,否则保持在原屏幕
// 这样的一个简单公式意思是:假设当前滑屏偏移值即 scrollCurX 加上每个屏幕一半的宽度,除以每个屏幕的宽度就是
// 我们目标屏所在位置了。 假如每个屏幕宽度为320dip, 我们滑到了500dip处,很显然我们应该到达第二屏,索引值为1
// 即(500 + 320/2)/320 = 1
final int screenWidth = getWidth();
final int destScreen = (getScrollX() + screenWidth / 2) / screenWidth;
snapToScreen(destScreen);
}
public void snapToScreen(int whichScreen) {
// get the valid layout page
whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));
if (getScrollX() != (whichScreen * getWidth())) {
final int delta = whichScreen * getWidth() - getScrollX();
mScroller.startScroll(getScrollX(), 0, delta, 0,
Math.abs(delta) * 5);
mCurScreen = whichScreen;
onScreenChangeListener.onScreenChange(mCurScreen);
invalidate(); // Redraw the layout
}
}
public void setToScreen(int whichScreen) {
whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));
mCurScreen = whichScreen;
scrollTo(whichScreen * getWidth(), 0);
}
public int getCurScreen() {
return mCurScreen;
}
/**
* 控制view跟随手指滑动 由父视图调用用来请求子视图根据偏移值 mScrollX,mScrollY重新绘制
*/
@Override
public void computeScroll() {
// 如果返回true,表示动画还没有结束
// 因为前面startScroll,所以只有在startScroll完成时 才会为false
if (mScroller.computeScrollOffset()) {
// 产生了动画效果,根据当前值 每次滚动一点
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate();
}
}
/*
* 其中:onInterceptTouchEvent()主要功能是控制触摸事件的分发,例如是子视图的点击事件还是滑动事件。
* 其他所有处理过程均在onTouchEvent()方法里实现了。 1、屏幕的滑动要根据手指的移动而移动 ----
* 主要实现在onTouchEvent()方法中
*
㈡ Android现在的最新版本是多少有什么优点
截止至2020年12月,最新版本为Android 11。
系统特点
Android的默认用户界面主要基于直接操作,透过触控松散地对应现实动作以作出输入,例如滑动、点击、捏动和反向挤压,随着虚拟键盘,以操控屏幕上的对象。游戏控制器及物理键盘都能透过蓝牙或USB得到支持。
在回应用家的输入方面,设计旨在提供立即流畅的触摸界面,经常使用设备的振动功能向用户提供触觉反馈。内部硬件,例如是加速规、陀螺仪、距离传感器都能被某些应用程序来回应用户的操作,例如根据设备的方向来把屏幕由纵向调整为横向,或容许用户透过旋转设备,在赛车游戏中驾驶车辆。
当Android设备引导就会进入主画面,那是设备的主要导航及信息“枢纽”,类似于个人电脑的桌面。
(2)android判断滑动方向扩展阅读
2020年6月11日凌晨正式推送了 Android 11 Beta 1 版系统,Android 11 Beta 1 简化了所有智能家居设备和蓝牙配件的控制。
2020年7月9日谷歌正式推送了 Android11 beta 2 更新,其中包括对系统软件 / 开发者的多项优化。引入了“平台稳定性”的概念,其在Android11 beta 2中鼓励开发人员开始对应用程序,SDK和库进行“最终兼容性测试”。
2020年8月7日谷歌正式推送了 Android11 beta 3 更新,这将是最后一个测试版本呢,甚至可以看作是准正式版。Beta 3版本已经修复了此前存在的重大问题以及Bug,而且力推API 30 SDK,希望开发者们尽快完成兼容性测试。
㈢ Android 12 兼容之行为变更
Android 12 平台包含一些行为变更,这些变更可能会影响您的应用。以下行为变更将影响在 Android 12 上运行的 所有应用 ,无论采用哪种 targetSdkVersion 都不例外。您应该测试您的应用,然后根据需要进行修改,以适当地支持这些变更。
此外,请务必查看 仅影响以 Android 12 为目标平台的应用的行为变更 列表。
在搭载 Android 12 及更高版本的设备上, 滚动事件 的视觉行为发生了变化。
在 Android 11 及更低版本中,滚动事件会使视觉元素发光。在 Android 12 及更高版本中,发生拖动事件时,视觉元素会拉伸和反弹;发生快速滑动事件时,它们会快速滑动和反弹。
如需了解详情,请参阅 动画演示滚动手势 指南。
如果您之前在 Android 11 或更低版本中实现了自定义启动画面,则需要将您的应用迁移到 SplashScreen API,以确保它从 Android 12 开始正确显示。如果不迁移您的应用,则可能会导致应用启动体验变差或出乎预期。
如需了解相关说明,请参阅 将现有的启动画面实现迁移到 Android 12 。
此外,从 Android 12 开始,在所有应用的 冷启动 和 温启动 期间,系统始终会应用新的 Android 系统默认启动画面 。 默认情况下,此系统默认启动画面由应用的启动器图标元素和主题的 windowBackground (如果是单色)构成。
如需了解详情,请参阅 启动画面开发者指南 。
从 Android 12(API 级别 31)开始,仅当您的应用获准处理某个通用网络 intent 中包含的特定网域时,该网络 intent 才会解析为应用中的 activity。如果您的应用未获准处理相应的网域,则该网络 intent 会解析为用户的默认浏览器应用。
应用可通过执行以下某项操作来获准处理相应的网域:
如果您的应用调用网络 intent,不妨考虑添加一个提示或对话框,要求用户确认操作。
Android 12 整合了现有行为,让用户可以 在沉浸模式下更轻松地执行手势导航命令 。此外,Android 12 还为 粘性沉浸模式提供了向后兼容性行为 。
Android 设备有许多不同的外形规格,如大屏设备、平板电脑和可折叠设备。为了针对每种设备适当地呈现内容,您的应用需要确定屏幕或显示屏尺寸。随着时间的推移,Android 提供了不同的 API 来检索这些信息。在 Android 11 中,我们引入了 WindowMetrics API 并废弃了以下方法:
在 Android 12 中,我们继续建议使用 WindowMetrics ,并且正在逐步废弃以下方法:
为了缓解应用使用 Display API 检索应用边界的行为,Android 12 限制了 API 为不完全可调整大小的应用返回的值。这可能会对将此信息与 MediaProjection 一起使用的应用产生影响。
应用应使用 WindowMetrics API 查询其窗口的边界,并使用 Configuration.densityDpi 查询当前的密度。
为了与较低的 Android 版本实现更广泛的兼容性,您可以使用 Jetpack WindowManager 库,它包含一个 WindowMetrics 类,该类支持 Android 4.0(API 级别 14)及更高版本。
首先,确保应用的 activity 完全可调整大小 。
activity 应依赖于来自 activity 上下文的 WindowMetrics 来执行任何与界面相关的工作,尤其是 WindowManager.getCurrentWindowMetrics() 或 Jetpack 的 WindowMetricsCalculator.computeCurrentWindowMetrics() 。
如果您的应用创建了 MediaProjection ,则必须正确地调整边界的大小,因为投影会捕获运行投影仪应用的显示分区。
如果应用完全可调整大小,则 activity 上下文会返回正确的边界,如下所示:
如果应用并非完全可调整大小,则它必须从 WindowContext 实例进行查询,并使用 WindowManager.getMaximumWindowMetrics() 或 Jetpack 方法 WindowMetricsCalculator.computeMaximumWindowMetrics() 检索 activity 边界的 WindowMetrics 。
注意 :任何使用 MediaProjection 的库也应遵循这些建议,并查询相应的 WindowMetrics 。
Android 12 将多窗口模式作为标准行为。
在大屏设备 (sw >= 600dp) 中,所有应用都将在多窗口模式下运行,无论应用配置为何。如果 resizeableActivity="false" ,应用会在必要时进入兼容模式,以适应显示屏尺寸。
在小屏设备 (sw < 600dp) 中,系统会检查 activity 的 minWidth 和 minHeight ,来确定 activity 能否在多窗口模式下运行。如果 resizeableActivity="false" ,则无论最小宽度和高度如何,应用都无法在多窗口模式下运行。
如需了解详情,请参阅 多窗口模式支持 。
相机应用通常假定设备的屏幕方向和相机预览的宽高比呈固定关系。但是,大屏设备类型(例如可折叠设备)和显示模式(例如多窗口和多屏幕)挑战着这一假设。
在 Android 12 上,请求特定屏幕方向且不可调整大小 ( resizeableActivity="false" ) 的相机应用会自动进入边衬区人像模式,从而确保相机预览的屏幕方向和宽高比正确。在可折叠设备和其他具有相机硬件抽象层 ( HAL ) 的设备上,会对相机输出应用额外的旋转以补偿相机传感器方向,并会剪裁相机输出以匹配应用相机预览的宽高比。无论设备屏幕方向如何以及设备是处于折叠状态还是展开状态,剪裁和额外的旋转可确保应用正确呈现相机预览。
除了 一些例外情况 之外,为了为短时间运行的 前台服务 提供流畅体验,搭载 Android 12 或更高版本的设备可以将前台服务通知的显示延迟 10 秒。此更改使某些短期任务可在显示通知之前完成。
Android 11(API 级别 30)引入了 受限存储分区 作为应用待机模式存储分区。从 Android 12 开始,此存储分区默认处于活跃状态。在所有存储分区中,受限存储分区的优先级最低(限制最高)。存储分区按优先级从高到低的顺序排列如下:
除了使用模式之外,系统还会考虑应用的行为,以决定是否要将您的应用放在受限存储分区中。
如果您的应用更负责地使用系统资源,就不太可能被放在受限存储分区中。此外,如果用户直接与您的应用互动,系统会将其放在一个限制较少的存储分区中。
如需检查系统是否已将您的应用放在受限存储分区中,请调用 getAppStandbyBucket() 。如果此方法的返回值为 STANDBY_BUCKET_RESTRICTED ,则您的应用在受限存储分区中。
如需测试您的应用在系统将其放在受限存储分区中时的行为,您可以手动将您的应用移至该存储分区。为此,请在终端窗口中运行以下命令:
在搭载 Android 12 或更高版本的受支持设备上,用户可以通过按一个切换开关选项,为设备上的所有应用启用和停用摄像头和麦克风使用权限。用户可以从 快捷设置 访问可切换的选项(如图 1 所示),也可以从系统设置中的“隐私设置”屏幕访问。
详细了解这些 切换开关 以及如何检查您的应用是否遵循了关于 CAMERA 和 RECORD_AUDIO 权限的最佳实践。
在搭载 Android 12 或更高版本的设备上,当应用使用麦克风或相机时,图标会出现在状态栏中。
详细了解这些 指标 以及如何检查您的应用是否遵循了关于 CAMERA 和 RECORD_AUDIO 权限的最佳实践。
[图片上传中...(image-bd519-1643780883994-1)]
<figcaption style="box-sizing: inherit; font-size: 14px; margin-top: -4px;"> 图 1. “快捷设置”中的麦克风和摄像头切换开关。</figcaption>
[图片上传中...(image-f49bfd-1643780883994-0)]
<figcaption style="box-sizing: inherit; font-size: 14px; margin-top: -4px;"> 图 2. 麦克风和摄像头指示标志,显示了最近的数据访问。</figcaption>
在搭载 Android 12 或更高版本的设备上,根据应用对其他应用的 软件包可见性 ,以 Android 11(API 级别 30)或更高版本为目标平台且调用以下某种方法的应用会收到一组过滤后的结果:
Android 12 移除了之前弃用的加密算法的许多 BouncyCastle 实现,包括所有 AES 算法。系统改用这些算法的 Conscrypt 实现。
如果符合以下任何条件,则此变更会影响您的应用:
在 Android 12 及更高版本中,当某个应用首次调用 getPrimaryClip() 以 从另一个应用访问剪辑数据 时,会弹出一个消息框消息,通知用户对剪贴板的访问。
消息框消息内的文本包含以下格式: <var translate="no" style="box-sizing: inherit; color: var(--devsite-var-color); -webkit-font-smoothing: auto; font-weight: 500;">APP</var> pasted from your clipboard.
注意 :您的应用可能会调用 getPrimaryClipDescription() 以接收有关 剪贴板上当前数据的信息 。当您的应用调用此方法时,系统不会显示消息框消息。
在 Android 12 及更高版本中, getPrimaryClipDescription() 可以检测到以下详细信息:
为了加强用户与应用和系统互动时的控制,从 Android 12 开始,弃用了 ACTION_CLOSE_SYSTEM_DIALOGS intent 操作。除了 一些特殊情况 之外,当应用尝试 调用包含此操作的 intent 时,系统会基于应用的目标 SDK 版本执行以下操作之一:
在以下情况下,应用仍然可以在 Android 12 或更高版本上关闭系统对话框:
为了维持系统安全并保持良好的用户体验,Android 12 会阻止应用使用 触摸事件 ,使用触摸事件时叠加层会以不安全的方式遮掩应用。 换言之,系统会屏蔽穿透某些窗口的触摸操作,但 有一些例外情况 。
此变更会影响选择让触摸操作穿透其窗口的应用,例如使用 FLAG_NOT_TOUCHABLE 标志。包括但不限于以下示例:
在以下情况下,允许执行“穿透”触摸操作:
如果系统屏蔽触摸操作, Logcat 会记录以下消息:
在搭载 Android 12 或更高版本的设备上,不受信任的触摸功能默认被屏蔽。如需允许不受信任的触摸操作,请在终端窗口中运行以下 ADB 命令 :
如需将行为还原为默认设置(不受信任的触摸操作被屏蔽),请运行以下命令:
Android 12 更改了在按下“返回”按钮时系统对为其任务根的启动器 activity 的默认处理方式。在以前的版本中,系统会在按下“返回”按钮时完成这些 activity。在 Android 12 中,现在系统会将 activity 及其任务移到后台,而不是完成 activity。当使用主屏幕按钮或手势从应用中导航出应用时,新行为与当前行为一致。
注意 :系统仅会将新行为应用于为其任务根的启动器 activity,即使用 ACTION_MAIN 和 CATEGORY_LAUNCHER 声明 intent 过滤器 的 activity。对于其他 activity,在按下“返回”按钮时,系统会像以前一样完成 activity。
对于大多数应用而言,此变更意味着使用“返回”按钮退出应用的用户可以更快地从 温状态 恢复应用,而不必从 冷状态 完全重启应用。
建议您针对此变更测试您的应用。如果您的应用目前替换 onBackPressed() 来处理返回导航并完成 Activity ,请更新您的实现来调用 super.onBackPressed() 而不是完成 Activity。调用 super.onBackPressed() 可在适当时将 activity 及其任务移至后台,并可为不同应用中的用户提供更一致的导航体验。
另请注意,通常,我们建议您使用 AndroidX Activity API 提供自定义返回导航 ,而不是替换 onBackPressed() 。如果没有组件拦截系统按下“返回”按钮,AndroidX Activity API 会自动遵循适当的系统行为。
在 Android 12 中,无论显示屏是否支持无缝过渡到新的刷新率,都会发生使用 setFrameRate() 实现的刷新率变化;无缝过渡是指没有任何视觉中断,比如一两秒钟的黑屏。以前,如果显示屏不支持无缝过渡,它在调用 setFrameRate() 后通常会继续使用同一刷新率。您可以调用 getAlternativeRefreshRates() 来提前确定向新刷新率的过渡是否有可能是无缝过渡。通常,会在刷新率切换完成后调用回调 onDisplayChanged() ,但对于某些外接显示屏,会在非无缝过渡期间调用该回调。
以下示例说明了您可以如何实现此行为:
Android 12 中添加了以下 API:
如需创建 Passpoint 建议,应用必须使用 PasspointConfiguration 、 Credential 和 HomeSp 类。这些类描述了 Wi-Fi Alliance Passpoint 规范 中定义的 Passpoint 配置文件。
如需了解详情,请参阅 适用于互联网连接的 Wi-Fi 建议 API 。
Android 12 包含更新后的受限制非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。在限制使用非 SDK 接口之前,我们会尽可能确保有可用的公开替代方案。
如果您的应用并非以 Android 12 为目标平台,其中一些变更可能不会立即对您产生影响。然而,虽然您目前仍可以使用一些非 SDK 接口( 具体取决于应用的目标 API 级别 ),但只要您使用任何非 SDK 方法或字段,终归存在导致应用出问题的显着风险。
如果您不确定自己的应用是否使用了非 SDK 接口,则可以 测试您的应用 来进行确认。如果您的应用依赖于非 SDK 接口,您应该开始计划迁移到 SDK 替代方案。然而,我们知道某些应用具有使用非 SDK 接口的有效用例。如果您无法为应用中的某项功能找到使用非 SDK 接口的替代方案,应 请求新的公共 API 。
如需详细了解此 Android 版本中的变更,请参阅 Android 12 中有关限制非 SDK 接口的更新 。如需全面了解有关非 SDK 接口的详细信息,请参阅 对非 SDK 接口的限制 。
㈣ android GridView 如何设置为左右可滚动
GridView不支持左右滚动。
左右滚动的需求可考虑:
在外层加一个HorizontalScrollView, 不过这种滑动体验并不好,上下左右均可滑动,如果是斜着滑的时候,体验差。当然,如果你会自定义HorizontalScrollView把滑动区分为斜着上下滑和斜着左右滑,再把斜着上下滑的事件传递给子View也是可以的。
可以考虑Viewpager里加载多个GridView,这样GridView就可以一页一页的滑
㈤ 移动端touch触屏滑动事件、滑动触屏事件监听!
一、触摸事件
ontouchstart、ontouchmove、ontouchend、ontouchcancel
目前移动端浏览器均支持这4个触摸事件,包括IE。由于触屏也支持MouseEvent,因此他们的顺序是需要注意的:touchstart → mouseover → mousemove → mousedown → mouseup → click1
Apple在iOS 2.0中引入了 触摸事件API ,Android正迎头赶上这一事实标准,缩小差距。最近一个W3C工作组正合力制定这一 触摸事件规范 。
二、规范
这里我们介绍几种普及得比较好的触摸事件,你可以在绝大多数现代浏览器中来测试这一事件(必须是触屏设备哦):
touchstart: 触摸开始的时候触发
touchmove: 手指在屏幕上滑动的时候触发
touchend: 触摸结束的时候触发
而每个触摸事件都包括了三个触摸列表,每个列表里包含了对应的一系列触摸点(用来实现多点触控):
touches: 当前位于屏幕上的所有手指的列表。
targetTouches: 位于当前DOM元素上手指的列表。
changedTouches: 涉及当前事件手指的列表。
每个触摸点由包含了如下触摸信息(常用):
identifier: 一个数值,唯一标识触摸会话(touch session)中的当前手指。一般为从0开始的流水号(android4.1,uc)
target: DOM元素,是动作所针对的目标。
pageX / pageX / clientX / clientY/screenX/screenY : 一个数值,动作在屏幕上发生的位置(page包含滚动距离,client不包含滚动距离,screen则以屏幕为基准)。
radiusX / radiusY/ rotationAngle: 画出大约相当于手指形状的椭圆形,分别为椭圆形的两个半径和旋转角度。初步测试浏览器不支持,好在功能不常用,欢迎大家反馈。
有了这些信息,我们就可以依据这些事件信息为用户提供不同的反馈了。
下面,我将为大家展示一个小demo,用touchmove实现的单指拖动:
三、手势事件
手势是指利用多点触控进行旋转、拉伸等操作,例如图片、网页的放大、旋转。需要两个或以上的手指同时触摸时才会触发手势事件。关于缩放我们需要注意的一点 是元素的位置坐标:我们通常使用offsetX、getBoundingClientRect等方法获取元素的位置坐标,但在手机浏览器中页面经常会在使 用中被缩放,那缩放后的元素坐标会改变吗?答案是有所差异。用一个情景来说明这个问题:页面A加载完成后, JavaScript 获 取到该元素在document中的坐标为(100,100),接着用户放大了页面,此时用JavaScript再次输出元素坐标,依然还是 (100,100),但该元素在屏幕上的响应区域会根据缩放比例产生偏移。你可以打开那个打砖块游戏demo,等页面完全加载完成后,再放大,此时你会发 现即使手指触摸在“touch here”区域外部,也可以控制到球板,因为区域发生了偏移。除非页面刷新或者恢复缩放,否则偏移量将一直存在。
四、重力感应
重力感应较简单,只需要为body节点添加onorientationchange事件即可。在此事件中由window.orientation属性得到代表当前手机方向的数值。window.orientation的值列表如下:
0:与页面首次加载时的方向一致
-90:相对原始方向顺时针转了90°
180:转了180°
90:逆时针转了90°据我测试,Android2.1尚未支持重力感应。以上即目前的触屏事件,这些事件尚未并入标准,但已被广泛使用。本人Android2.1,未在其他环境下测试。