android单点触控移动,多点触控放大缩小

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

  
    <ImageView
        android:id="@+id/imgage"
        android:src="@drawable/liying"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
       />

</RelativeLayout>

MainActivity.class:

package com.example.day4_one;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

import android.app.Activity;
import android.content.res.Resources;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class MainActivity extends Activity {
    private ImageView image;
    float lastDistance = -1;
    float x0 = 0;
    float y0 = 0;
     private int screenWidth; 
       private int screenHeight; 
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        image = (ImageView) findViewById(R.id.imgage);
        //获得屏幕宽高 不让出界
         DisplayMetrics dm = getResources().getDisplayMetrics(); 
            screenWidth = dm.widthPixels; 
            screenHeight = dm.heightPixels-100; 

        image.setOnTouchListener(new OnTouchListener() {
             
            private float x;
            private float y;

            @Override
            public boolean onTouch(View v,final MotionEvent event) {
                // TODO Auto-generated method stub
                int action = event.getAction();
                Log.i("TAG","触摸开始......");
                switch (action) {
                case MotionEvent.ACTION_DOWN:
                    //getX()是表示Widget相对于自身左上角的x坐标,而getRawX()是表示相对于屏幕左上角的x坐标值(注意:这个屏幕左上角是手机屏幕左上角,不管activity是否有titleBar或是否全屏幕)
                    x = event.getRawX();
                    y = event.getRawX();
                    break;
                
                case MotionEvent.ACTION_MOVE:
                    //得到触摸点的个数
                    int count = event.getPointerCount();
                    Log.i("TAG","触摸点的个数:"+count);
                    
                    if(count > 1){
                        Log.i("TAG", event.getX(0)+","+event.getY(0)+"|"+event.getX(1)+","+event.getY(1));
                        //获得两点的坐标差
                        float distanceX = event.getX(0) - event.getX(1);
                        float distanceY = event.getY(0) - event.getY(1);
                        //获得两点之间的距离
                        float betweenDistance = (float) Math.sqrt(distanceX*distanceX + distanceY*distanceY);
                        Log.i("TAG","当前两点之间的新距离:"+betweenDistance);
                    
                        if(betweenDistance < 1){
                            lastDistance = betweenDistance;
                            
                        }else if((betweenDistance - lastDistance) > 5){
                            //放大
                            lastDistance = betweenDistance;
                            //获得布局参数
                            RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) image.getLayoutParams();
                            params.width = (int) (image.getWidth()*1.1f);
                            params.height = (int) (image.getHeight()*1.1f);
                            image.setLayoutParams(params);
                        }else if((lastDistance - betweenDistance) > 5){
                            lastDistance = betweenDistance;
                            //获得布局参数
                            RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) image.getLayoutParams();
                            params.width = (int) (image.getWidth()*0.9f);
                            params.height = (int) (image.getHeight()*0.9f);
                            image.setLayoutParams(params);
                        }
                        
                    }else if(count == 1){
                        
                        //移动距离
                        float rawX = event.getRawX()-x;
                        float rawy = event.getRawY()-y;
                        //定义新的
                        int left = (int) (image.getLeft()+rawX);
                        int top = (int) (image.getTop()+rawy);
                        int right = (int) (image.getRight()+rawX);
                        int bottom = (int) (image.getBottom()+rawy);
                         // 设置不能出界 
                          if (left < 0) { 
                              left = 0; 
                              right = left + v.getWidth(); 
                          } 
           
                          if (right > screenWidth) { 
                              right = screenWidth; 
                              left = right - v.getWidth(); 
                          } 
           
                          if (top < 0) { 
                              top = 0; 
                              bottom = top + v.getHeight(); 
                          } 
           
                          if (bottom > screenHeight) { 
                              bottom = screenHeight; 
                              top = bottom - v.getHeight(); 
                          } 
                        
                        
                        //赋值
                        image.layout(left, top, right, bottom);
                        //改成新的按下作标
                        x=event.getRawX();
                        y=event.getRawY();
                        /*return false;*/
                    }
                    break;

              
                }
                
                return true;
            }
        });
    }
    //全局移动
   @Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
      /*image.setX(event.getX());
        image.setY(event.getY()); */
    return true;
}
    

}
原文地址:https://www.cnblogs.com/123p/p/5377811.html