- 浏览: 150098 次
- 性别:
- 来自: 五指山
文章分类
最新评论
-
dengdonglin888:
qq_30221445 写道你好 请问这种数据能解吗 < ...
Simple XML -
qq_30221445:
你好 请问这种数据能解吗 <request> ...
Simple XML -
画个逗号给明天qu:
画个逗号给明天qu 写道
Android上传文件到服务器 -
画个逗号给明天qu:
...
Android上传文件到服务器 -
alranger:
我在jsp页面加上这一段代码后,问题还是存在。
解决Ext在ie9报错:不支持extjs对象的“createContextualFragment属性或方法”
我们大家都知道,由于Android 2.x开始很多API变动比较大新增了一些比如多点触控的支持,对于屏幕触控手势识别中我们需要考虑更多的实现方法,下面是一段兼容Android 1.x和2.x的代码,可以让我们的程序兼容几乎99%的Android手机。
一、首先新建一个抽象类判断SDK版本问题
Java代码:
public abstract class VersionedGestureDetector {
private static final String TAG = "VersionedGestureDetector";
OnGestureListener mListener;
public static VersionedGestureDetector newInstance(Context context,
OnGestureListener listener) {
/*设计实例化构造方法,这里Androideoe提示大家目前有3种API的实现方法,我们需要逐一考虑最优的解决方法,以满足高平台更多的功能实现。*/
final int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
//使用android.os.Build判断API Level,但需要将字符串转换为整形
VersionedGestureDetector detector = null;
if (sdkVersion < Build.VERSION_CODES.ECLAIR) {
//如果版本小于2.0则使用1.5版本的API,可以兼容1.5和1.6
detector = new CupcakeDetector();
} else if (sdkVersion < Build.VERSION_CODES.FROYO) {
//如果版本小于2.1则使用2.0版本的API,可以兼容2.0,2.0.1和2.1这三个版本
detector = new EclairDetector();
} else {
//否则使用2.2开始的新的触控API
detector = new FroyoDetector(context);
}
Log.d(TAG, "Created new " + detector.getClass()); //判断最终选择的到底是哪个版本的类
detector.mListener = listener;
return detector;
}
public abstract boolean onTouchEvent(MotionEvent ev);
//我们需要根据版本决定onTouchEvent的实现
public interface OnGestureListener { //手势判断接口主要是实现两个方法
public void onDrag(float dx, float dy); //拖拽
public void onScale(float scaleFactor); //缩放
}
private static class CupcakeDetector extends VersionedGestureDetector {
//针对Android 1.5和1.6设计的兼容方式
float mLastTouchX;
float mLastTouchY;
float getActiveX(MotionEvent ev) { //获得当前X坐标
return ev.getX();
}
float getActiveY(MotionEvent ev) { //获得当前Y坐标
return ev.getY();
}
boolean shouldDrag() { //是否是拖拽中或者说移动中
return true;
}
@Override
public boolean onTouchEvent(MotionEvent ev) { //重写onTouchEvent方法
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN: { //向下
mLastTouchX = getActiveX(ev);
mLastTouchY = getActiveY(ev);
break;
}
case MotionEvent.ACTION_MOVE: {
/*Androideoe提醒大家,由于1.x时代的API比较简单,很多手势没有封装,我们只能从ACTION_MOVE中根据坐标变化判断手势样式*/
final float x = getActiveX(ev);
final float y = getActiveY(ev);
if (shouldDrag()) {
mListener.onDrag(x - mLastTouchX, y - mLastTouchY); //处理拖拽移动
}
mLastTouchX = x;
mLastTouchY = y;
break;
}
}
return true;
}
}
private static class EclairDetector extends CupcakeDetector {
//这个是针对Android 2.0,2.0.1和2.1提供的解决方法,可以看到有很多多点触控相关API出现
private static final int INVALID_POINTER_ID = -1;
private int mActivePointerId = INVALID_POINTER_ID;
private int mActivePointerIndex = 0;
@Override
float getActiveX(MotionEvent ev) {
return ev.getX(mActivePointerIndex);
}
@Override
float getActiveY(MotionEvent ev) {
return ev.getY(mActivePointerIndex);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
final int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mActivePointerId = ev.getPointerId(0);
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
mActivePointerId = INVALID_POINTER_ID;
break;
case MotionEvent.ACTION_POINTER_UP: //有个点松开
final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)
>> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
final int pointerId = ev.getPointerId(pointerIndex); //获取第几个点
if (pointerId == mActivePointerId) {
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
mActivePointerId = ev.getPointerId(newPointerIndex);
mLastTouchX = ev.getX(newPointerIndex); //处理第newPointerIndex个点的x位置
mLastTouchY = ev.getY(newPointerIndex);
}
break;
}
mActivePointerIndex = ev.findPointerIndex(mActivePointerId);
return super.onTouchEvent(ev);
}
}
private static class FroyoDetector extends EclairDetector {
//从Android 2.2开始可以很好的处理多点触控的缩放问题
private ScaleGestureDetector mDetector;
public FroyoDetector(Context context) {
mDetector = new ScaleGestureDetector(context,
new ScaleGestureDetector.SimpleOnScaleGestureListener() {
@Override public boolean onScale(ScaleGestureDetector detector) {
mListener.onScale(detector.getScaleFactor()); //根据 ScaleGestureDetector.SimpleOnScaleGestureListener这个系统类处理缩放情况通过onScale方法
return true;
}
});
}
@Override
boolean shouldDrag() {
return !mDetector.isInProgress();
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
mDetector.onTouchEvent(ev);
return super.onTouchEvent(ev);
}
}
}
复制代码
有关调用方法,我们可以自定义一个View,取名为TouchExampleView类,这里来处理触控相关的问题
Java代码:
public class TouchExampleView extends View {
private Drawable mIcon; //我们以一个图片为参照物,根据手势控制
private float mPosX;
private float mPosY;
private VersionedGestureDetector mDetector;
private float mScaleFactor = 1.f; //原始缩放比例为1.0
public TouchExampleView(Context context) {
this(context, null, 0);
}
public TouchExampleView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TouchExampleView(Context context, AttributeSet attrs, int defStyle) { //实现我们自定义View的构造
super(context, attrs, defStyle);
mIcon = context.getResources().getDrawable(R.drawable.icon);
mIcon.setBounds(0, 0, mIcon.getIntrinsicWidth(), mIcon.getIntrinsicHeight());
mDetector = VersionedGestureDetector.newInstance(context, new GestureCallback());
//实例化刚才的版本自适应手势控制类
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
//重写onTouchEvent方法,使用VersionedGestureDetector类得出的数据。
mDetector.onTouchEvent(ev);
return true;
}
@Override
public void onDraw(Canvas canvas) { //处理自定义View绘制方法
super.onDraw(canvas);
canvas.save();
canvas.translate(mPosX, mPosY); //进行平移操作,根据mPosX和mPosY坐标
canvas.scale(mScaleFactor, mScaleFactor); //进行缩放操作,参数就是刚才定义的float类型的缩放比例
mIcon.draw(canvas); //直接绘制图片变化到画布中
canvas.restore();
}
private class GestureCallback implements VersionedGestureDetector.OnGestureListener {
public void onDrag(float dx, float dy) {
//这里Android123提示大家在2.2中这个回调方法将可以支持拖拽的坐标处理
mPosX += dx;
mPosY += dy;
invalidate();
}
public void onScale(float scaleFactor) {
mScaleFactor *= scaleFactor; //缩放控制
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));
//限制最小缩放比例为1.0最大为5.0倍数
invalidate();
}
}
}
复制代码
有关调用我们的自定义的TouchExampleView可以在Activity的onCreate方法中加入以下代码
Java代码:
TouchExampleView view = new TouchExampleView(this);
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
setContentView(view); //替换掉原始的res.layout.main
复制代码
最后Androideoe需要给大家说明的是使用本例子,直接使用Android 2.2的SDK创建工程,即API Level为8,发布时在androidmanifest.xml中加入uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8"这句可以兼容从Android 1.5到2.2的版本,有关2.3中新增的一个可以处理5个或5个以上的多点触控增强类Android开发网将在以后的时间中介绍。
转载出自:http://www.apkbus.com/forum.php?mod=viewthread&tid=848
一、首先新建一个抽象类判断SDK版本问题
Java代码:
public abstract class VersionedGestureDetector {
private static final String TAG = "VersionedGestureDetector";
OnGestureListener mListener;
public static VersionedGestureDetector newInstance(Context context,
OnGestureListener listener) {
/*设计实例化构造方法,这里Androideoe提示大家目前有3种API的实现方法,我们需要逐一考虑最优的解决方法,以满足高平台更多的功能实现。*/
final int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
//使用android.os.Build判断API Level,但需要将字符串转换为整形
VersionedGestureDetector detector = null;
if (sdkVersion < Build.VERSION_CODES.ECLAIR) {
//如果版本小于2.0则使用1.5版本的API,可以兼容1.5和1.6
detector = new CupcakeDetector();
} else if (sdkVersion < Build.VERSION_CODES.FROYO) {
//如果版本小于2.1则使用2.0版本的API,可以兼容2.0,2.0.1和2.1这三个版本
detector = new EclairDetector();
} else {
//否则使用2.2开始的新的触控API
detector = new FroyoDetector(context);
}
Log.d(TAG, "Created new " + detector.getClass()); //判断最终选择的到底是哪个版本的类
detector.mListener = listener;
return detector;
}
public abstract boolean onTouchEvent(MotionEvent ev);
//我们需要根据版本决定onTouchEvent的实现
public interface OnGestureListener { //手势判断接口主要是实现两个方法
public void onDrag(float dx, float dy); //拖拽
public void onScale(float scaleFactor); //缩放
}
private static class CupcakeDetector extends VersionedGestureDetector {
//针对Android 1.5和1.6设计的兼容方式
float mLastTouchX;
float mLastTouchY;
float getActiveX(MotionEvent ev) { //获得当前X坐标
return ev.getX();
}
float getActiveY(MotionEvent ev) { //获得当前Y坐标
return ev.getY();
}
boolean shouldDrag() { //是否是拖拽中或者说移动中
return true;
}
@Override
public boolean onTouchEvent(MotionEvent ev) { //重写onTouchEvent方法
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN: { //向下
mLastTouchX = getActiveX(ev);
mLastTouchY = getActiveY(ev);
break;
}
case MotionEvent.ACTION_MOVE: {
/*Androideoe提醒大家,由于1.x时代的API比较简单,很多手势没有封装,我们只能从ACTION_MOVE中根据坐标变化判断手势样式*/
final float x = getActiveX(ev);
final float y = getActiveY(ev);
if (shouldDrag()) {
mListener.onDrag(x - mLastTouchX, y - mLastTouchY); //处理拖拽移动
}
mLastTouchX = x;
mLastTouchY = y;
break;
}
}
return true;
}
}
private static class EclairDetector extends CupcakeDetector {
//这个是针对Android 2.0,2.0.1和2.1提供的解决方法,可以看到有很多多点触控相关API出现
private static final int INVALID_POINTER_ID = -1;
private int mActivePointerId = INVALID_POINTER_ID;
private int mActivePointerIndex = 0;
@Override
float getActiveX(MotionEvent ev) {
return ev.getX(mActivePointerIndex);
}
@Override
float getActiveY(MotionEvent ev) {
return ev.getY(mActivePointerIndex);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
final int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mActivePointerId = ev.getPointerId(0);
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
mActivePointerId = INVALID_POINTER_ID;
break;
case MotionEvent.ACTION_POINTER_UP: //有个点松开
final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)
>> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
final int pointerId = ev.getPointerId(pointerIndex); //获取第几个点
if (pointerId == mActivePointerId) {
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
mActivePointerId = ev.getPointerId(newPointerIndex);
mLastTouchX = ev.getX(newPointerIndex); //处理第newPointerIndex个点的x位置
mLastTouchY = ev.getY(newPointerIndex);
}
break;
}
mActivePointerIndex = ev.findPointerIndex(mActivePointerId);
return super.onTouchEvent(ev);
}
}
private static class FroyoDetector extends EclairDetector {
//从Android 2.2开始可以很好的处理多点触控的缩放问题
private ScaleGestureDetector mDetector;
public FroyoDetector(Context context) {
mDetector = new ScaleGestureDetector(context,
new ScaleGestureDetector.SimpleOnScaleGestureListener() {
@Override public boolean onScale(ScaleGestureDetector detector) {
mListener.onScale(detector.getScaleFactor()); //根据 ScaleGestureDetector.SimpleOnScaleGestureListener这个系统类处理缩放情况通过onScale方法
return true;
}
});
}
@Override
boolean shouldDrag() {
return !mDetector.isInProgress();
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
mDetector.onTouchEvent(ev);
return super.onTouchEvent(ev);
}
}
}
复制代码
有关调用方法,我们可以自定义一个View,取名为TouchExampleView类,这里来处理触控相关的问题
Java代码:
public class TouchExampleView extends View {
private Drawable mIcon; //我们以一个图片为参照物,根据手势控制
private float mPosX;
private float mPosY;
private VersionedGestureDetector mDetector;
private float mScaleFactor = 1.f; //原始缩放比例为1.0
public TouchExampleView(Context context) {
this(context, null, 0);
}
public TouchExampleView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TouchExampleView(Context context, AttributeSet attrs, int defStyle) { //实现我们自定义View的构造
super(context, attrs, defStyle);
mIcon = context.getResources().getDrawable(R.drawable.icon);
mIcon.setBounds(0, 0, mIcon.getIntrinsicWidth(), mIcon.getIntrinsicHeight());
mDetector = VersionedGestureDetector.newInstance(context, new GestureCallback());
//实例化刚才的版本自适应手势控制类
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
//重写onTouchEvent方法,使用VersionedGestureDetector类得出的数据。
mDetector.onTouchEvent(ev);
return true;
}
@Override
public void onDraw(Canvas canvas) { //处理自定义View绘制方法
super.onDraw(canvas);
canvas.save();
canvas.translate(mPosX, mPosY); //进行平移操作,根据mPosX和mPosY坐标
canvas.scale(mScaleFactor, mScaleFactor); //进行缩放操作,参数就是刚才定义的float类型的缩放比例
mIcon.draw(canvas); //直接绘制图片变化到画布中
canvas.restore();
}
private class GestureCallback implements VersionedGestureDetector.OnGestureListener {
public void onDrag(float dx, float dy) {
//这里Android123提示大家在2.2中这个回调方法将可以支持拖拽的坐标处理
mPosX += dx;
mPosY += dy;
invalidate();
}
public void onScale(float scaleFactor) {
mScaleFactor *= scaleFactor; //缩放控制
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));
//限制最小缩放比例为1.0最大为5.0倍数
invalidate();
}
}
}
复制代码
有关调用我们的自定义的TouchExampleView可以在Activity的onCreate方法中加入以下代码
Java代码:
TouchExampleView view = new TouchExampleView(this);
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
setContentView(view); //替换掉原始的res.layout.main
复制代码
最后Androideoe需要给大家说明的是使用本例子,直接使用Android 2.2的SDK创建工程,即API Level为8,发布时在androidmanifest.xml中加入uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8"这句可以兼容从Android 1.5到2.2的版本,有关2.3中新增的一个可以处理5个或5个以上的多点触控增强类Android开发网将在以后的时间中介绍。
转载出自:http://www.apkbus.com/forum.php?mod=viewthread&tid=848
发表评论
-
xUtils简介
2014-11-25 10:04 845xUtils 包含了很多实用的android工具。 xU ... -
直接拿来用!最火的Android开源项目
2014-07-25 11:01 701转 http://www.admin10000.com/d ... -
Android APK反编译详解(附图)
2014-03-28 10:56 820http://blog.csdn.net/ithomer/ar ... -
小米人
2014-02-17 17:23 686http://www.xiaomiren.net/ -
android开发之gallery 兑现滚动一张且短距离滑动实现滚动
2013-07-02 15:28 663http://www.myexception.cn/andro ... -
TextView显示插入的图片
2013-07-01 11:29 700http://orgcent.com/android-text ... -
TextView使用SpannableString设置复合文本
2013-07-01 11:29 648http://orgcent.com/android-text ... -
转:::Android TextView文字横向自动滚动(跑马灯)
2013-06-17 11:45 1513TextView实现文字滚动需要以下几个要点: 1.文字长度长 ... -
相片滤镜开源
2013-04-27 15:01 736https://github.com/daizhenjun/I ... -
android图片特效处理之模糊效果
2013-04-27 14:57 829http://blog.csdn.net/sjf0115/ar ... -
android图片处理方法(不断收集中)
2013-04-27 14:57 559http://gundumw100.iteye.com/blo ... -
Android, WindowsPhone7, IOS ,vc2010平台40多套图片滤镜开源
2013-04-27 14:56 665http://www.cnblogs.com/daizhj/a ... -
移动云存储平台
2013-04-25 16:13 906http://bmob.cn 关于Bmob 对于很多 ... -
android ExpandableListView简单应用及listview模拟ExpandableListView
2013-02-28 11:45 693http://blog.csdn.net/jj120522/a ... -
android_App集成支付宝
2013-02-28 11:43 790http://www.cnblogs.com/qianxude ... -
Android Pull Refresh View 插件
2012-12-01 12:43 847Android Pull Refresh View htt ... -
Android-TelephoneManager(转载)
2012-10-09 22:08 1347好文章齐分享。原文地址:http://blog.si ... -
android 开源 listview separato
2012-08-27 22:51 665http://code.google.com/p/androi ... -
fragment开源项目 学习
2012-08-13 12:02 929https://github.com/tisa007/Andr ... -
Fragment学习
2012-08-13 11:53 670http://www.eoeandroid.com/threa ...
相关推荐
这是基于python、opencv写的可以识别简单手势的项目源代码,可以运行,没有bug。
Android输入法手势识别例子代码,android.gesture这个类在api-4(SDK1.6)才开始支持的!默认存到SD卡中,所以别忘记在AndroidMainfest.xml加上SD卡读写权限!测试时请您在紧凑的时间内用两笔划来完成一个手势! ...
# Python手势识别代码 基于MediaPipe手部关键点检测 识别数字手势 1. 使用MediaPipe库实现手部21个关键点实时检测; 2. 根据手部关键点坐标计算五根手指的角度; 3. 通过手指角度判断手势,例程中包含数字0~9的手势...
毫米波雷达手势数据集以及手势识别系统源码.zip毫米波雷达手势数据集以及手势识别系统源码.zip毫米波雷达手势数据集以及手势识别系统源码.zip毫米波雷达手势数据集以及手势识别系统源码.zip毫米波雷达手势数据集以及...
基于麦克风阵列的手势认证识别系统前端源码.zip基于麦克风阵列的手势认证识别系统前端源码.zip基于麦克风阵列的手势认证识别系统前端源码.zip基于麦克风阵列的手势认证识别系统前端源码.zip基于麦克风阵列的手势认证...
基于yolov5视觉检测的无人机手势识别控制方法源码.zip PC_camera文件夹用于使用电脑摄像头进行手势识别控制飞行,应事先配置Pytorch环境,将文件夹中两个文件和权重文件复制到YOLO v5工程中,即可运行。UAV_camera...
答辩基于计算机视觉手势识别技术PPT课件.pptx
C8T6-9960_红外手势识别_9960_能识别上扬_红外手势_下滑_红外手势识别资料_源码.zip
基于Android的手势识别系统的设计.pdf
2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于卷积...
《基于YOLOv5的手势识别系统(含手势识别数据集+训练代码)》:https://blog.csdn.net/guyuealian/article/details/126750433 手势识别(HGR)作为人机交互的一部分,在汽车领域、家庭自动化系统、各种视频/流媒体平台...
答辩基于计算机视觉的手势识别技术PPT课件.pptx
手机输入法手势识别源代码输入法手势识别 注意: android.gesture这个类在api-4(SDK1.6)才开始支持的! 提醒:默认存到SD卡中,所以别忘记在AndroidMainfest.xml加上SD卡读写权限! 关于两种方式创建模拟器的...
基于视觉的手势识别技术_孙丽娟.caj,参考文献,正规论文
基于机器学习的动态体感手势识别系统_高鑫.caj
基于matlab的简单手势识别代码,初学者可自行下载。
Android触屏手势识别Demo源码.rar
输入法手势识别 注意: android.gesture这个类在api-4(SDK1.6)才开始支持的! 提醒:默认存到SD卡中,所以别忘记在AndroidMainfest.xml加上SD卡读写权限! 关于两种方式创建模拟器的SDcard在【Android2D...
人工智能-深度学习-tensorflow