Android学习(23)OntTouch_触摸事件
OnTouch:触摸事件
通过getPointerCount获取手指数量
1.单点触摸:将图片移动到触摸位置
(1)在布局文件中添加一张图片,给布局文件添加id
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/ivLayout">
<ImageView
android:id="@+id/ivST"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/kcbb"/>
</RelativeLayout>
(2)在Activity中设置触摸监听
public class SingleTouchActivity extends AppCompatActivity {
//定义一个ImageView
private ImageView iv;
//声明一个RelativeLayout
private RelativeLayout layout;
//声明一个RelativeLayout.LayoutParams用于设置图片位置
private RelativeLayout.LayoutParams rl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_single_touch);
//绑定组建
iv = (ImageView)findViewById(R.id.ivST);
layout = (RelativeLayout)findViewById(R.id.ivLayout);
//对layout设置触摸监听
layout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//当移动时
if (event.getAction() == MotionEvent.ACTION_MOVE) {
//获取图片位置
rl = (RelativeLayout.LayoutParams)iv.getLayoutParams();
//获取点击的位置的Y坐标,设置为上边距
rl.topMargin = (int)event.getY();
//获取点击的位置的X坐标,设置为左
rl.leftMargin = (int)event.getX();
//设置图片位置
iv.setLayoutParams(rl);
}
return true;
}
});
}
}
2.多点触控:实现双指缩放图片
(1)新建一个视图,绘制图片
MyMutilTouch.java
public class MyMutilTouch extends SurfaceView implements SurfaceHolder.Callback{
//实例化Bitmap,用于加载图片
private Bitmap bitmap;
//加载图片的矩形框
private Rect src = new Rect();
//图片
private RectF dst = new RectF();
//实例化一个坐标点对象,用于设置放大倍数
private PointF scale = new PointF(1,1);
//构造函数
public MyMutilTouch(Context context) {
super(context);
//回调
getHolder().addCallback(this);
//引入图片
bitmap = ((BitmapDrawable)(getResources().getDrawable(R.drawable.nazi))).getBitmap();
//确定图片的宽和高
src.right = bitmap.getWidth();
src.bottom = bitmap.getHeight();
dst.right = src.right;
dst.bottom = src.bottom;
}
//绘制图片
public void draw(){
//锁定画布
Canvas canvas = getHolder().lockCanvas();
//设置背景颜色
canvas.drawColor(0xffffffff);
//让绘图保持可编辑、可存储状态
canvas.save();
//缩放画布(X轴缩放倍数,Y轴缩放倍数,缩放原点X坐标,缩放原点Y坐标)
canvas.scale(getScale().x,getScale().y,getWidth()/2,getHeight()/2);
//绘制图片
canvas.drawBitmap(bitmap,src,dst,null);
//画布回滚,释放资源
canvas.restore();
//解锁画布
getHolder().unlockCanvasAndPost(canvas);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
draw();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
//控制图片变化,设置图片变化的倍数
public void scale(float scalex,float scaley){
getScale().x = scalex;
getScale().y = scaley;
draw();
}
public PointF getScale() {
return scale;
}
public void setScale(PointF scale) {
this.scale = scale;
}
}
(2)在Activity中设置触摸事件监听
public class MutilTouchActivity extends AppCompatActivity implements View.OnTouchListener {
//声明新的视图
private MyMutilTouch view;
private float tance = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//实例化视图
view = new MyMutilTouch(this);
//引入视图
setContentView(view);
//绑定触摸监听
view.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
//如果触摸的手指大于2
if (event.getPointerCount() >= 2) {
//获取第一个触摸点的X,Y坐标
float p1_x = event.getX(0);
float p1_y = event.getY(0);
//获取第二个触摸点的X,Y坐标
float p2_x = event.getX(1);
float p2_y = event.getY(1);
//获取两个点的X,Y坐标的距离
float diff_x = p1_x - p2_x;
float diff_y = p1_y - p2_y;
//通过勾股定理计算得到两点间的距离
float distance = (float) Math.sqrt(diff_x * diff_x + diff_y *diff_y);
//输出两点间的距离
System.out.println("distance"+distance);
System.out.println("tancs:"+tance);
if (tance == 0) {
tance = distance;
}else {
if (distance - tance > 10) {
//放大
view.scale(view.getScale().x + 0.1f,view.getScale().y + 0.1f);
tance = distance;
}else if(distance - tance < -10){
//缩小
view.scale(view.getScale().x - 0.1f,view.getScale().y - 0.1f);
System.out.println(distance);
tance = distance;
}
}
if (event.getAction() == MotionEvent.ACTION_UP) {
tance = 0;
}
}
return true;
}
}