本文章分为两部分,第一部分先讲解下需要用到的知识点,第二部分提供代码实例。文章来源:https://www.toymoban.com/news/detail-623551.html
相关知识
MotionEvent中的动作符
-
ACTION_DOWN:单指按下动作(仅在第一根手指按下时有效)
-
ACTION_POINTER_DOWN:双指及多指按下动作(仅在第二根手指或者大于第二根手指按下时有效)
-
ACTION_POINTER_UP:双指及多汁抬起动作(仅在第二根手指或者大于第二根的手指抬起时有效)
-
ACTION_UP:单指抬起动作(仅在第一根手指抬起时有效)
-
ACTION_MOVE:手指移动动作(不限手指个数)
-
ACTION_SCROLL:view上下或者左右滑动动作
缩放及位移方法
-
setTranslationX:控件沿x轴的位移,负数左移,正数右移
-
setTranslationY:控件沿y轴的位移,负数上移,正数下移
-
setScaleX:控件沿x轴缩放比
-
setScaleY:控件沿y轴缩放比
代码示例
package com.example.myapplication;
import static android.content.ContentValues.TAG;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
private static final String TAG = "xiong_tag";
private float oldDistance;//刚按下时双指之间的距离
private float newDistance;//在屏幕上滑动后双指之间的距离
private float scalePoint;//缩放中心点
private float scale = 1f;//缩放比
private float translationX;//x轴移动量
private float translationY;//y轴位移量
private float oldCenterX;//刚按下时双指之间的点的x坐标
private float oldCenterY;//刚按下时双指之间的点的y坐标
private float newCenterX;//在屏幕上滑动后双指之间的点的x坐标
private float newCenterY;//在屏幕上滑动后双指之间的点的y坐标
private ImageView imageView;//缩放控件,可以是别的控件,如果是surfaceView那么要注意如果Android版本低于或者等于6,那么是不支持用这个方法进行缩放的
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imageview);
imageView.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_POINTER_DOWN:
Log.d(TAG, "onTouch: pointer down");
if(event.getPointerCount() == 2) {//getPointerCount返回的是手指的数量
oldDistance = calculateDistance(event);//计算距离
oldCenterX = calculateCenter(event, true);//计算两指之间的中心点的x坐标
oldCenterY = calculateCenter(event, false);//计算两指之间的中心点的y坐标
}
break;
case MotionEvent.ACTION_MOVE:
Log.d(TAG, "onTouch: move");
if (event.getPointerCount() == 2) {
newDistance = calculateDistance(event);
scale += (newDistance - oldDistance) / oldDistance;
newCenterX = calculateCenter(event, true);
newCenterY = calculateCenter(event, false);
//缩放
imageView.setScaleX(scale);
imageView.setScaleY(scale);
//位移
translationX += newCenterX - oldCenterX;
translationY += newCenterY - oldCenterY;
imageView.setTranslationX(translationX);
imageView.setTranslationY(translationY);
}
break;
}
return true;
}
private float calculateDistance(MotionEvent motionEvent) {
float x1 = motionEvent.getX(0);//第一个点x坐标
float x2 = motionEvent.getX(1);//第二个点x坐标
float y1 = motionEvent.getY(0);//第一个点y坐标
float y2 = motionEvent.getY(1);//第二个点y坐标
return (float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
/*
*@param isX 是否是x坐标
*/
private float calculateCenter(MotionEvent motionEvent, boolean isX) {
return isX ? (motionEvent.getX(1) + motionEvent.getX(0)) / 2 : (motionEvent.getY(1) + motionEvent.getY(0)) / 2;
}
}
以上就是全部内容了,谢谢观看。文章来源地址https://www.toymoban.com/news/detail-623551.html
到了这里,关于Android控件双指缩放及双指拖动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!