Android控件双指缩放及双指拖动

本文章分为两部分,第一部分先讲解下需要用到的知识点,第二部分提供代码实例。

相关知识

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;
    }
}

以上就是全部内容了,谢谢观看。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android平台上,可以使用一些常用的手势操作来实现图片的平移、双指缩放和双击放大缩小。 首先,为了实现平移功能,可以使用触摸事件的ACTION_MOVE来处理手指在屏幕上滑动的操作。通过计算滑动距离,可以改变图片的位置从而实现平移效果。 其次,双指缩放可以使用触摸事件的ACTION_POINTER_DOWN和ACTION_POINTER_UP来追踪并处理触摸屏幕上第二个手指按下和松开的操作。在处理时,可以通过计算两个手指触摸点之间的距离来改变图片的缩放比例,从而实现双指缩放效果。 最后,双击放大缩小可以通过设置一个双击的监听器来实现。在双击监听器的回调方法中,可以根据当前的图片缩放状态来判断是进行放大操作还是缩小操作。并根据需要更改图片的缩放比例,实现双击放大缩小功能。 在实现上述功能时,可以使用Android提供的一些核心类来辅助开发,如View、MotionEvent、GestureDetector等。同时,还可以结合自定义View和动画效果来提升用户体验,使图片的平移、缩放和双击动作更加流畅和自然。 总之,通过合理运用触摸事件、手势识别、双击监听器等技术,可以在Android上实现图片的平移、双指缩放和双击放大缩小功能,从而提升用户与应用程序的交互体验。 ### 回答2: 在Android开发中,可以通过使用ImageView控件来实现对图片的平移、双指缩放和双击放大缩小操作。 1. 平移:可以通过使用Matrix类对ImageView进行变换来实现图片的平移。首先,我们需要为ImageView设置一个OnTouchListener来监听用户的手势操作。在手势操作的回调方法中,可以通过获取手指按下和移动的位置差来计算出需要平移的距离,然后通过设置Matrix的平移矩阵来实现图片的平移效果。 2. 双指缩放:可以通过GestureDetector类来监听双指缩放手势。在手势操作的回调方法中,可以获取到两个手指的起始位置和当前位置,通过计算两个手指之间的距离差来判断缩放的比例。然后,再通过设置Matrix的缩放矩阵来实现图片的缩放效果。需要注意的是,在进行缩放操作时,还需要考虑到手指中心点的位置变化。 3. 双击放大缩小:也可以通过GestureDetector类来监听双击手势。在手势操作的回调方法中,可以判断是否发生了双击事件,并获取到双击的位置。当双击事件发生时,可以通过判断当前图片的缩放比例来决定是放大还是缩小。通过设置Matrix的缩放矩阵和平移矩阵来实现图片的放大缩小效果。 需要注意的是,为了实现图片的平移、双指缩放和双击放大缩小操作,我们需要对ImageView进行一系列的监听和处理操作。同时,为了方便管理和控制这些操作,可以将相关的代码封装成一个自定义的图片控件,并在该控件中进行处理。 ### 回答3: Android 提供了多种方法来实现图片的平移、双指缩放和双击放大缩小功能。 首先,要实现图片的平移,我们可以使用 GestureDetector 类。可以通过重写 onScroll() 方法来检测用户的滑动手势,然后将图片的位置进行相应的调整,从而实现平移效果。 其次,要实现双指缩放功能,我们可以借助 ScaleGestureDetector 类。通过重写 onScale() 方法,我们可以获取用户的缩放手势,并根据手势的缩放比例调整图片的尺寸,从而实现双指缩放的效果。 最后,要实现双击放大缩小功能,我们可以使用 GestureDetector 类。可以通过重写 onDoubleTap() 方法来检测用户的双击手势,然后根据当前图片的尺寸和双击事件的位置,来判断是进行放大还是缩小操作,最后将图片的尺寸进行相应的调整,实现双击放大缩小的效果。 需要注意的是,以上的功能实现是基于 Android 的原生 API,还有其他第三方库也提供了更便捷的方法来实现这些功能,例如 PhotoView 库,它提供了更多灵活的选项和交互效果,可以更加方便地实现图片的平移、缩放和双击操作。 综上所述,Android 针对图片的平移、双指缩放和双击放大缩小,可以通过重写相应的手势监听方法或使用第三方库来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值