手势(Gesture)
ContentProvider简介
操作系统的ContentProvider
实现ContentProvider
监听ContentProvider的数据改变
手势(Gesture)
所谓手势,指用户手指或触摸笔在触摸屏上的连续触碰行为。手势这种连续的触碰会形成某个方向上的移动趋势,也会形成一个不规则的几何图形。
Android对两种手势行为都提供了支持:
第一种手势行为而言,Android提供了手势检测,并为手势提供相应的监听器。
对于第二种手势行为,Android允许开发者添加手势,并提供相应的API。
1.1 手势检测
GestureDetector是一个手势检测器,创建GestureDetector时需要传入一个GestureDetector.OnGestureListener实例, 负责对用户的手势行为提供响应。GestureDetector包含的事件处理方法如下:
boolean onDown(MotionEvent e):当触碰事件按下时触发该方法。
boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) :在触摸屏上拖过时触发该方法。
void onLongPress(MotionEvent e):当用户在屏幕上长按时触发该方法。
boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):当用户在屏幕上”滚动”时触发该方法。
void onShowPress(MotionEvent e) :当用户在触摸屏上按下、而且还未移动和松开时触发该方法。
boolean onSingleTapConfirmed(MotionEvent e)
boolean onSingleTapUp(MotionEvent e):用户在屏幕上的轻击事件将会触发该方法。
使用Android手势检测只需要两个步骤:
创建一个GestureDetector对象,创建该对象时必须实现GestureDetector.OnGestureListener监听器实例。
为应用程序的Activity的TouchEvent事件绑定监听器,在事件处理中指定把Activity上的TouchEvent事件交给GestureDetector处理。
例:手势动作测试:
手势动作测试
GestureTest.java
public class GestureTest extends Activity
implements OnGestureListener
{
// 定义手势检测器实例
GestureDetector detector;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//创建手势检测器
detector = new GestureDetector(this);
}
//将该Activity上的触碰事件交给GestureDetector处理
@Override
public boolean onTouchEvent(MotionEvent me)
{
return detector.onTouchEvent(me);
}
@Override
public boolean onDown(MotionEvent arg0)
{
Toast.makeText(this,"onDown" , 8000)
.show();
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY)
{
Toast.makeText(this , "onFling" , 8000)
.show();
return false;
}
@Override
public void onLongPress(MotionEvent e)
{
Toast.makeText(this ,"onLongPress" , 8000)
.show();
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY)
{
Toast.makeText(this ,"onScroll" , 8000)
.show();
return false;
}
@Override
public void onShowPress(MotionEvent e)
{
Toast.makeText(this ,"onShowPress" , 8000)
.show();
}
@Override
public boolean onSingleTapUp(MotionEvent e)
{
Toast.makeText(this ,"onSingleTapUp" , 8000)
.show();
return false;
}
}
例:手势实现翻页效果:
GestureFlip.java
public class GestureFlip extends Activity
implements OnGestureListener
{
// ViewFlipper实例
ViewFlipper flipper;
// 定义手势检测器实例
GestureDetector detector;
//定义一个动画数组,用于为ViewFlipper指定切换动画效果
Animation[] animations = new Animation[4];
//定义手势动作两点之间的最小距离
final int FLIP_DISTANCE = 50;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//创建手势检测器
detector = new GestureDetector(this);
// 获得ViewFlipper实例
flipper = (ViewFlipper) this.findViewById(R.id.flipper);
// 为ViewFlipper添加5个ImageView组件
flipper.addView(addImageView(R.drawable.java));
flipper.addView(addImageView(R.drawable.ee));
flipper.addView(addImageView(R.drawable.ajax));
flipper.addView(addImageView(R.drawable.xml));
flipper.addView(addImageView(R.drawable.classic));
//初始化Animation数组
animations[0] = AnimationUtils.loadAnimation(this
, R.anim.left_in);
animations[1] = AnimationUtils.loadAnimation(this
, R.anim.left_out);
animations[2] = AnimationUtils.loadAnimation(this
, R.anim.right_in);
animations[3] = AnimationUtils.loadAnimation(this
, R.anim.right_out);
}
// 定义添加ImageView的工具方法
private View addImageView(int resId)
{
ImageView imageView = new ImageView(this);
imageView.setImageResource(resId);
imageView.setScaleType(ImageView.ScaleType.CENTER);
return imageView;
}
@Override
public boolean onFling(MotionEvent event1, MotionEvent event2,
float velocityX, float velocityY)
{
/*
* 如果第一个触点事件的X座标大于第二个触点事件的X座标超过FLIP_DISTANCE
* 也就是手势从右向左滑。
*/
if (event1.getX() - event2.getX() > FLIP_DISTANCE)
{
// 为flipper设置切换的的动画效果
flipper.setInAnimation(animations[0]);
flipper.setOutAnimation(animations[1]);
flipper.showPrevious();
return true;
}
/*
* 如果第二个触点事件的X座标大于第一个触点事件的X座标超过FLIP_DISTANCE
* 也就是手势从右向左滑。
*/
else if (event2.getX() - event1.getX() > FLIP_DISTANCE)
{
// 为flipper设置切换的的动画效果
flipper.setInAnimation(animations[2]);
flipper.setOutAnimation(animations[3]);
flipper.showNext();
return true;
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
//将该Activity上的触碰事件交给GestureDetector处理
return detector.onTouchEvent(event);
}
@Override
public boolean onDown(MotionEvent arg0)
{
return false;
}
@Override
public void onLongPress(MotionEvent event)
{
}
@Override
public boolean onScroll(MotionEvent event1, MotionEvent event2,
float arg2, float arg3)
{
return false;
}
@Override
public void onShowPress(MotionEvent event)
{
}
@Override
public boolean onSingleTapUp(MotionEvent event)
{
return false;
}
}
Main.xm
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"