惠普的惠普台式电脑序列号怎么拆后盖

1777人阅读
android(31)
android 手势识别处理(2)
当希望 & 处理 & & & 点击view &或者滑动屏幕 的 事件的时候 &我们会设置一些 &监听器
1、常规的点击滑动的事件处理
设置一些监听器、如button、seekBar 等的onClickListener() & onScrollLisrener() & onLongClickListener() setOnKeyListener()等等。。。。可以进行一些常规的 &点击事件的处理。
2、当我们进行一些复杂的手势 处理的时候 &常规的监听器就不够用了
我们可以通过MotionEvent的getAction()方法来获取Touch事件的类型,包括 ACTION_DOWN(按下触摸屏), ACTION_MOVE(按下触摸屏后移动受力点), ACTION_UP(松开触摸屏)和ACTION_CANCEL(不会由用户直接触发)。借助对于用户不同操作的判断,结合getRawX()、getRawY()、getX()和getY()等方法来获取坐标后进行判断处理。
1)可以给view 设置 &onTouchListner() & 重写他的onTouch(View view &MotionEvent &event)如下:
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN :
float startX = event.getX();
............
case MotionEvent.ACTION_MOVE:
endX = event.getX();
..........
return true;
但是, &这样要 &程序员自己 & &通用 & &计算 startX &endX等值来判断 & 到底用户是怎么样的手势。
2)重写View 类的 onTuchEvent(MotionEvent &event)方法 & 来处理 &这些手势事件
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mStartY = event.getY();
mStartX = event.getX();
case MotionEvent.ACTION_MOVE:
mEndY = event.getY();
mEndX = event.getX();
float dy = mEndY - mStartY;
if (Math.abs(dy) & 20)
//低于20像素的滑动不算
if (mStartX & 0.25 * mWindowWidth && mEndX & 0.25 * mWindowWidth) {
//滑动的是屏幕的左边
float percent = dy / mWindowHeignt;
mBrightness = mBrightness - percent * 255f;
if (mBrightness & 255f) {
mBrightness = 255f;
} else if (mBrightness & 0) {
mBrightness = 0;
setScreenBrightness((int) mBrightness);
mStartY = mEndY;
} else if (mStartX & 0.75 * mWindowWidth && mEndX & 0.75 * mWindowWidth) {
//滑动的是屏幕的右边
float percent = dy / mWindowHeignt;
mCurrentVolume = mCurrentVolume - percent * mMaxVolume;
if (mCurrentVolume & mMaxVolume) {
mCurrentVolume = mMaxVolume;
} else if (mCurrentVolume & 0) {
mCurrentVolume = 0;
mStartY = mEndY;
setVolume();
//设置 系统的声音
case MotionEvent.ACTION_UP:
btVolume.setVisibility(View.GONE);
btBright.setVisibility(View.GONE);
mEndY = event.getY();
if (Math.abs(mEndY - mStartY) & 10) {
//相当于点击了屏幕
呼唤出控制界面
showOrDismissTools();
//显示或者隐藏 工具控制栏
return true;
这两种方法 &对事件的处理方法都是一样的 & 要自己来计算处理识别 &手势 & 比较灵活
3)使用GestureDetector类来处理 & &手势
Androidsdk给我们提供了GestureDetector(Gesture:手势Detector:识别)类,它的内部已经将很多的滑动事件识别成了手势类型,通过这个类我们可以识别很多
的手势类型:
手势识别器的使用步骤:
1、创建 &手势识别器:
public GestureDetector mGestureDetector
GestureDetector(Context context, GestureDetector.OnGestureListener listener);
第一个参数是 context 第二个参数是 一个回到接口OnGestureListener,OnDoubleTapListener,SimpleOnGestureListener。他们三个都是
接口类,我们要写一个他们的 实现类 然后传给GestureDetector以便它回调
查看源码可以看到SimpleOnGestureListener &它实现了 GestureDetector的三个接口
public static class SimpleOnGestureListener implements OnGestureListener, OnDoubleTapListener,OnContextClickListener {.......}
所以开发中 & 多用 & &自己的监听器继承SimpleOnGestureListener & &然后重写要实现的方法
//1、创建一个手势识别器
private GestureDetector mGestureDetector
= new GestureDetector(getApplicationContext(),new MySimpleOnGestureListener());
//3、将MotionEvent
事件传给GestureDetector处理
// MotionEvent 可以来自OnTouchEvent(MotionEvent event) 或者来自OnTouchListener的onTouch(View view,MotionEvent event);
// 这里使用来自OnTouchEvent(MotionEvent event)的效果是一样的
public boolean onTouchEvent(MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
//将事件传递给了GestureDetector
然后它内部将事件进行判断识别
调用监听器中的对应方法
//最终实现事件的处理
//2、写一个 手势识别器回到子类-----在里面处理各个手势对应的代码
public class MySimpleOnGestureListener
extends GestureDetector.SimpleOnGestureListener{
public boolean onDown(MotionEvent e) {
//填写自己要处理的代码
return false;
.....缩略很多个要实现的方法.............
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//填写自己要处理的代码
return false;
SimpleOnGestureListener &可以重写的 方法 &分别对应不同的手势事件
除了上面的 &手势识别器 &还有 &缩放手势识别器(ScaleGestureDetector)
private ScaleGestureDetector scaleGestureDetector = new ScaleGestureDetector(Context context, OnScaleGestureListener listener)
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:23166次
排名:千里之外
原创:32篇
评论:10条
(1)(1)(3)(6)(4)(5)(13)(3)4130人阅读
Android实战(45)
& & & & &最近在iPhone有一款应用非常火,较做Clear,这个是演示视频:
&实施上它的功能非常的简单,类似一个ToDoList,但它将用户体验做到了极致,其中一个最大的特点就是将手势和多点触控成功得融入到了应用之中。
& & & & &这篇文章要探究的就是在Android中的手势和多点触控的原理及实现。
二、最原始的单点拖拽和两点缩放
原理:对于常规的控件触控操作,在setOnTouchListener()接口中,实现
onTouchEvent()方法来处理。
代码清单:
package com.example.
import android.os.B
import android.annotation.SuppressL
import android.annotation.TargetA
import android.app.A
import android.graphics.M
import android.graphics.PointF;
import android.view.GestureD
import android.view.M
import android.view.MotionE
import android.view.V
import android.view.View.OnTouchL
import android.widget.ImageV
import android.widget.T
import android.view.GestureDetector.OnGestureL
public class MainActivity extends Activity implements OnTouchListener{
public ImageView myImageV
private static final int NONE = 0;
private static final int DRAG = 1;
private static final int ZOOM = 2;
private int mode = NONE;
private Matrix tmpMatrix=new Matrix();;
private Matrix savedMatrix = new Matrix();
private PointF startPoint = new PointF();
private PointF endPoint=new PointF();
private PointF midPoint = new PointF();
private float oldD
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myImageView=(ImageView)findViewById(R.id.myImageView);
myImageView.setOnTouchListener(this);
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
public boolean onTouch(View v, MotionEvent event) {
//获取触控的点数
int pointCount = event.getPointerCount();
switch(event.getAction() & MotionEvent.ACTION_MASK){
//单手指按下
case MotionEvent.ACTION_DOWN:
//将当前的坐标保存为起始点
startPoint.set(event.getX(), event.getY());
tmpMatrix.set(myImageView.getImageMatrix());
savedMatrix.set(tmpMatrix);
mode = DRAG;
//第二根手指按下
case MotionEvent.ACTION_POINTER_DOWN:
oldDistance = (float) Math.sqrt((event.getX(0) - event.getX(1)) * (event.getX(0) - event.getX(1)) + (event.getY(0) - event.getY(1)) * (event.getY(0) - event.getY(1)));
if (oldDistance & 10f)
savedMatrix.set(tmpMatrix);
midPoint.set((event.getX(0) + event.getX(1))/2, (event.getY(0) + event.getY(1))/2);
mode = ZOOM;
//指点杆保持按下,并且进行位移
case MotionEvent.ACTION_MOVE:
//拖拽模式
if (mode == DRAG) {
tmpMatrix.set(savedMatrix);
tmpMatrix.postTranslate(event.getX() - startPoint.x, event.getY()
- startPoint.y);
//缩放模式
else if (mode == ZOOM)
float newDist =
(float) Math.sqrt((event.getX(0) - event.getX(1)) * (event.getX(0) - event.getX(1)) + (event.getY(0) - event.getY(1)) * (event.getY(0) - event.getY(1)));
if (newDist & 10f)
tmpMatrix.set(savedMatrix);
float scale = newDist / oldD
tmpMatrix.postScale(scale, scale, midPoint.x, midPoint.y);
//有手指抬起,将模式设为NONE
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
myImageView.setImageMatrix(tmpMatrix);
代码解释:MainActivity实现OnTouchLietener的接口,将ImageView的触控 监听器设置为this,在重载函数OnTouch中实现对触控事件的处理。
这里的图像的位置和大小的变化都用到了矩阵运算,不太清楚的话可以先补充一下线性代数的知识。
拖拽的实现就是用矩阵记录手指移动的距离;缩放的时候,首先要记录两只手指最开始的距离,然后当手指移动的时候,实时计算出手指的距离,与之前的距离相除得到缩放的比例,然后用矩阵的scale方法存储。
函数的最后调用 setImageMatrix()来实现对TextView的缩放或移动。
二、手势识别& & & & 上面的例子虽然实现了基本的触控功能,而且低版本的系统也能很好的支持,但如果遇到了高级的触控事件,比如双击,长按之类,实现起来就非常麻烦了!& & & & &好在后续版本的api提供了更加棒的接口,我们可以很简单地来实现想要的效果。& & & & &这里要用到的是Android给我们提供的手势识别工具GestureDetector,需要2.2及以上的系统版本。& & & & &下面的例子实现的效果是:单点拖拽,滑动切换imageView的内容,两点缩放,双击图像改变图像显示状态。效果:package com.example.
import java.util.R
import android.os.B
import android.app.A
import android.graphics.M
import android.graphics.PointF;
import android.view.GestureD
import android.view.GestureDetector.SimpleOnGestureL
import android.view.M
import android.view.MotionE
import android.view.ScaleGestureD
import android.view.ScaleGestureDetector.OnScaleGestureL
import android.view.V
import android.widget.ImageV
import android.widget.T
public class MainActivity extends Activity {
private GestureDetector myD
private ImageView myImageV
private ScaleGestureDetector mScaleGestureD
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDetector=new GestureDetector(this,new MyGestureListener());
mScaleGestureDetector=new ScaleGestureDetector(this,new MyScaleGestureListener());
matrix=new Matrix();
myImageView=(ImageView)findViewById(R.id.myImageView);
random=new Random();
public boolean onTouchEvent(MotionEvent event) {
int pointCount = event.getPointerCount();
if(pointCount==1)
return myDetector.onTouchEvent(event);
return mScaleGestureDetector.onTouchEvent(event);
private class MyGestureListener extends SimpleOnGestureListener
Matrix mMatrix=new Matrix();
PointF startPoint=new PointF();
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// TODO Auto-generated method stub
mMatrix.set(myImageView.getImageMatrix());
System.out.println(&distanceX:&+distanceX+&distanceY:&+distanceY);
startPoint.set(e1.getRawX(), e1.getRawY());
mMatrix.postTranslate(-distanceX,-distanceY);
myImageView.setImageMatrix(mMatrix);
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
final int FLING_MIN_DISTANCE = 100, FLING_MIN_VELOCITY = 200;
if (e1.getX() - e2.getX() & FLING_MIN_DISTANCE && Math.abs(velocityX) & FLING_MIN_VELOCITY) {
// Fling left
myImageView.setImageResource(R.drawable.pic0);
Toast.makeText(getApplicationContext(), &Fling Left&, Toast.LENGTH_SHORT).show();
} else if (e2.getX() - e1.getX() & FLING_MIN_DISTANCE && Math.abs(velocityX) & FLING_MIN_VELOCITY) {
// Fling right
switch(random.nextInt(5))
myImageView.setImageResource(R.drawable.pic2);
myImageView.setImageResource(R.drawable.pic3);
myImageView.setImageResource(R.drawable.pic7);
myImageView.setImageResource(R.drawable.pic5);
myImageView.setImageResource(R.drawable.pic6);
Toast.makeText(getApplicationContext(), &Fling Right&, Toast.LENGTH_SHORT).show();
// 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发
public boolean onDown(MotionEvent arg0) {
Toast.makeText(getApplicationContext(), &onDown&, Toast.LENGTH_SHORT).show();
public boolean onDoubleTap(MotionEvent e)
if(myImageView.isShown())
myImageView.setVisibility(View.INVISIBLE);
else myImageView.setVisibility(View.VISIBLE);
private class MyScaleGestureListener implements OnScaleGestureListener
private float oldD
private float newD
Matrix mMatrix = new Matrix();
public boolean onScale(ScaleGestureDetector detector) {
// TODO Auto-generated method stub
newDist=detector.getCurrentSpan();
mMatrix.set(myImageView.getImageMatrix());
//缩放比例
//float scale = detector.getScaleFactor()/3;
float scale=newDist/oldD
System.out.println(&scale:&+scale);
//mMatrix.setScale(scale, scale,detector.getFocusX(),detector.getFocusY());
mMatrix.postScale(scale, scale,detector.getFocusX(),detector.getFocusY());
myImageView.setImageMatrix(mMatrix);
oldDist=newD
public boolean onScaleBegin(ScaleGestureDetector detector) {
// TODO Auto-generated method stub
oldDist=detector.getCurrentSpan();
newDist=detector.getCurrentSpan();
public void onScaleEnd(ScaleGestureDetector detector) {
// TODO Auto-generated method stub
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
代码解释:
这里我定义了两个GestrueListener,一个专门用于处理缩放的ScaleOnGestrueListener一个SimpleOnGestrueListener,当触控的点数为2的时候调用前者来处理,一般常用的手势用后者来处理。
原理和前面的差不多,只是调用不同的接口和不同的方法来实现,但是更加方便也更加清晰.
三、一点后记
学习Andorid中的某个类的时候,其实最好的方法是去看官方的API,有时候网上虽然有现成的代码给你,但实际运用的时候还是会有各种各样的问题,很多文章大都有雷同,甚至代码本身就有bug还往上粘,唉.....所以,最好还是自己踏踏实实研究。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1336317次
积分:18329
积分:18329
排名:第439名
原创:413篇
译文:29篇
评论:627条
文章:19篇
阅读:101045
(5)(4)(3)(4)(3)(1)(10)(4)(6)(5)(3)(3)(5)(2)(5)(5)(2)(2)(2)(3)(5)(4)(6)(1)(1)(3)(4)(10)(4)(9)(11)(10)(6)(8)(14)(4)(5)(14)(18)(12)(6)(12)(16)(19)(18)(27)(28)(3)(1)(10)(8)(1)(6)(4)(5)(19)(9)(8)(12)(1)(1)(2)(4)(2)(1)安卓的手势识别框架
安卓的手势识别框架
编辑日期: 字体:
android2.2开始安卓中出现了ScaleGestureDetector 。从此第一台多点触控的安卓手机出现了,不管是手机还是ScaleGestureDetector都非常了不起。但我疑惑不解的是,为什么ScaleGestureDetector是唯一一个多点触控手势识别api,为什么没有类似于旋转手势识别的api,识别两个手指(或者多个手指)配合而造成的旋转。难道是因为安卓和google之间的专利战争导致的吗?我不管那么多,反正我就是要用,因此我写了这个小项目,用于扩展原有的api,这篇文章将会讲解如何在app中使用这个项目。
为什么我要写这个小框架
当我用google搜索实现两个手指旋转的坚决方案的时候,我找到了很多解决此问题的办法,这些办法来自于不同的开发者,但是它们都有一个缺点,就是少了点的味道,不好重用,非常难以扩展。
同时我幻想google有一天会将RotationGestureDetector(或者类似的名字)加入到中(这一天终究没有到来),就像现在已经有了的ScaleGestureDetector 一样。到那时我只需将import 的声明改下,而不必去修改activity。这就是我为什么要写这个手势识别的原因。你可以在github上找到该项目。
如何使用安卓自带的ScaleGestureDetector
从如何在activity中使用ScaleGestureDetector开始讲吧
基本代码结构
在activity中你需要实现android.view.View.OnTouchListener以及其onTouch(...)方法,这样安卓系统就会在android.view.MotionEvent发生的时候通知它。
public class TouchActivity extends Activity implements OnTouchListener {
public void onCreate(Bundle savedInstanceState) {
// Init stuff here
public boolean onTouch(View v, MotionEvent event) {
// Handle touch events here
现在你可以通过onTouch(...)来获得所有的多点触控事件了,但是相信我,你绝对会写出一堆杂乱无章的代码来,所以还是用android.view.ScaleGestureDetector来优雅的解决这个问题吧。
public class TouchActivity extends Activity implements OnTouchListener {
private ScaleGestureDetector mScaleD
public void onCreate(Bundle savedInstanceState) {
mScaleDetector = new ScaleGestureDetector(getApplicationContext(), new ScaleListener());
public boolean onTouch(View v, MotionEvent event) {
mScaleDetector.onTouchEvent(event);
首先当然是创建ScaleGestureDetecto 的对象,在这里这个对象是mScaleDetector ,我们将MotionEvent 转交给mScaleDetector.onTouchEvent(event),这样mScaleDetector 就能计算出是否发生了缩放事件。但是我们如何处理用户缩放操作的呢?
使用Listener来处理事件
你可能注意到了在初始化ScaleGestureDetector的时候也新建了一个ScaleListener。这个Listener将在scale事件发生的时候通知我们,并传递相关的数据。ScaleListener是我们定义的一个内部类:
public class TouchActivity extends Activity implements OnTouchListener
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
public boolean onScale(ScaleGestureDetector detector) {
mScaleSpan = detector.getCurrentSpan(); // average distance between fingers
ScaleListener实现了ScaleGestureDetector的内部接口SimpleOnScaleGestureListener。这样ScaleGestureDetector就知道如何在scale事件发生的时候去调用我们的这个实现。在onScale(...)方法中,我们可以读取出需要的来自ScaleGestureDetector的数据。
使用scale的相关数据
既然ScaleListener是一个内部类,因此我们可以使用activity中的变量来保存数据,以便用于绘制(渲染等)缩放效果,这些操作可以在onTouch(...)完成。
public class TouchActivity extends Activity implements OnTouchListener
private float mScaleSpan = 1.0f;
private ScaleGestureDetector mScaleD
public boolean onTouch(View v, MotionEvent event) {
mScaleDetector.onTouchEvent(event);
// 在这里通过mScaleSpan 的值来完成你想要的操作
// Perform your magic with mScaleSpan now!
// indicate event was handled
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
public boolean onScale(ScaleGestureDetector detector) {
mScaleSpan = detector.getCurrentSpan(); // average distance between fingers
// indicate event was handled
保存两个手势之间的状态
detector.getCurrentSpan() 返回的始终是两个手指之间的距离。因此我们使用ScaleGestureDetector.getScaleFactor()同时将=变成*=。
public class TouchActivity extends Activity implements OnTouchListener
private float mScaleFactor = 1.0f;
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
public boolean onScale(ScaleGestureDetector detector) {
mScaleFactor *= detector.getScaleFactor(); // scale change since previous event
// indicate event was handled
Almeros(作者自己)的手势检测类
ok,现在你学会了以面向对象的方式来处理安卓中标准的多点触摸手势了。我所要介绍的手势处理类也是相同的使用方法。我将首先介绍两个我自定义的手势处理类。
RotateGestureDetector
只有两只以上的手指触摸屏幕才会产生旋转事件,下面是RotateGestureDetector的使用
public class TouchActivity extends Activity implements OnTouchListener {
private float mRotationDegrees = 0.f;
private class RotateListener extends RotateGestureDetector.SimpleOnRotateGestureListener {
public boolean onRotate(RotateGestureDetector detector) {
mRotationDegrees -= detector.getRotationDegreesDelta();
MoveGestureDetector的用法
其实这是一个简化了操作流程的手势识别类,即便没有这个你也可以处理还,但是使用MoveGestureDetector可以让代码变得更简单。
public class TouchActivity extends Activity implements OnTouchListener {
private float mFocusX = 0.f;
private float mFocusY = 0.f;
private class MoveListener extends MoveGestureDetector.SimpleOnMoveGestureListener {
public boolean onMove(MoveGestureDetector detector) {
PointF d = detector.getFocusDelta();
mFocusX += d.x;
mFocusY += d.y;
// mFocusX = detector.getFocusX();
// mFocusY = detector.getFocusY();
所有的手势识别类结合在一起
import com.almeros.android.multitouch.gesturedetectors.MoveGestureD
import com.almeros.android.multitouch.gesturedetectors.RotateGestureD
public class TouchActivity extends Activity implements OnTouchListener {
private float mScaleFactor = 1.0f;
private float mRotationDegrees = 0.f;
private float mFocusX = 0.f;
private float mFocusY = 0.f;
private ScaleGestureDetector mScaleD
private RotateGestureDetector mRotateD
private MoveGestureDetector mMoveD
public void onCreate(Bundle savedInstanceState) {
// Setup Gesture Detectors
mScaleDetector = new ScaleGestureDetector(getApplicationContext(), new ScaleListener());
mRotateDetector = new RotateGestureDetector(getApplicationContext(), new RotateListener());
mMoveDetector = new MoveGestureDetector(getApplicationContext(), new MoveListener());
public boolean onTouch(View v, MotionEvent event) {
mScaleDetector.onTouchEvent(event);
mRotateDetector.onTouchEvent(event);
mMoveDetector.onTouchEvent(event);
// Mmmmmhhhagic!!!
with: mScaleFactor, mRotationDegrees, mFocusX and mFocusY
// indicate event was handled
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
public boolean onScale(ScaleGestureDetector detector) {
mScaleFactor *= detector.getScaleFactor(); // scale change since previous event
private class RotateListener extends RotateGestureDetector.SimpleOnRotateGestureListener {
public boolean onRotate(RotateGestureDetector detector) {
mRotationDegrees -= detector.getRotationDegreesDelta();
private class MoveListener extends MoveGestureDetector.SimpleOnMoveGestureListener {
public boolean onMove(MoveGestureDetector detector) {
PointF d = detector.getFocusDelta();
mFocusX += d.x;
mFocusY += d.y;
翻译自 /android-multitouch-gesture-detectors#.VNrg7_mSwTx
本文固定链接:
转载请注明:
作者:leehom
本博客主要是把自己的经验记录于此,方便自己以后查阅及其他遇到类似问题的朋友参考。如果你有觉得不错的文章,可以注册会员发布文章或者邮箱发给我文章地址,谢谢!
如果觉得文章还不错,请麻烦点下广告,算是赞助下本站服务器费用,谢谢!
您可能还会对这些文章感兴趣!

我要回帖

更多关于 惠普4446s拆后盖 的文章

 

随机推荐