• Android 单指触控拖拽,两指触控缩放


     1 import android.app.Activity;
     2 import android.os.Bundle;
     3 import android.util.Log;
     4 import android.view.MotionEvent;
     5 import android.view.View;
     6 import android.view.Window;
     7 import android.widget.FrameLayout;
     8 import android.widget.FrameLayout.LayoutParams;
     9 
    10 public class MainActivity extends Activity {
    11 
    12     View view;
    13     public static final int DRAG = 1;
    14     public static final int SCALE = 2;
    15     int mode = 1;
    16     float lengthOld = 1;//初始化两指之间原长
    17     
    18     //初始化圆点高宽,java代码中操作的宽高都是像素值,dp*density转成px  
    19     int width = 40;
    20     int height = 40;
    21     
    22     @Override
    23     protected void onCreate(Bundle savedInstanceState) {
    24         super.onCreate(savedInstanceState);
    25         requestWindowFeature(Window.FEATURE_NO_TITLE);
    26         setContentView(R.layout.activity_main);
    27         Log.e("TAG", "像素密度:"+getResources().getDisplayMetrics().density);
    28         view = findViewById(R.id.view);
    29     }
    30 
    31     /**
    32      * 在MainActivity中画一个圆
    33      * Activity重写onTouchEvent,触摸监听
    34      * getRawX(),getRawY()是获取手机屏幕上的点到屏幕左上角顶点的距离
    35      * getX(),getY()是获取视图坐标,子视图在父视图中的位置
    36      */
    37     @Override
    38     public boolean onTouchEvent(MotionEvent event) {
    39         //记录坐标,圆点距离视图顶点
    40         int x = (int) event.getX();
    41         int y = (int) event.getY();
    42         
    43         //多指触控
    44         //获取事件源,并通过event.getActionMasked()加入多点触控支持
    45         switch (event.getAction() & event.getActionMasked()) {
    46         case MotionEvent.ACTION_DOWN:
    47             //单指移动
    48             mode = DRAG;
    49             break;
    50         case MotionEvent.ACTION_POINTER_DOWN:
    51             //多指缩放
    52             Log.e("TAG", "多指移动");
    53             mode = SCALE;
    54             //计算两指间开始的原长
    55             lengthOld = calculation(event);
    56             break;
    57         case MotionEvent.ACTION_UP:
    58             lengthOld = 1;//复位
    59             break;
    60         case MotionEvent.ACTION_MOVE:
    61             if(mode == DRAG){
    62                 //单指,直接设置坐标
    63                 FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(width, height);
    64                 params.setMargins(x, y, 0, 0);
    65                 view.setLayoutParams(params);
    66                 
    67             }else{
    68                 //两指缩放,要计算缩放比例
    69                 float scale = calculation(event) / lengthOld;
    70                 width = (int) (view.getWidth() * scale);
    71                 height = (int) (view.getHeight() * scale);
    72                 
    73                 FrameLayout.LayoutParams params = (LayoutParams) view.getLayoutParams();
    74                 params.width = width;
    75                 params.height = height;
    76                 view.setLayoutParams(params);
    77             }
    78             break;
    79         }
    80         
    81         return true;
    82     }
    83 
    84     
    85     private float calculation(MotionEvent event) {
    86         
    87         float x1 = event.getX();
    88         float x2 = event.getX(1);
    89         float y1 = event.getY();
    90         float y2 = event.getY(1);
    91         
    92         return (float) Math.sqrt(Math.pow((x1-x2), 2)+Math.pow((y1-y2), 2));
    93     }
    94 }

    xml中设置

     1 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     android:layout_width="match_parent"
     3     android:layout_height="match_parent" >
     4 
     5     <View
     6         android:id="@+id/view"
     7         android:layout_width="20dp"
     8         android:layout_height="20dp"
     9         android:background="@drawable/oval" />
    10 
    11 </FrameLayout>
  • 相关阅读:
    软件工程第三次个人作业——最大连续子数组和
    LeetCode(258.各位相加)的思路及解决过程
    VS2017中对C++的单元测试
    对大学三年学习生活的总结与反思
    软件工程 实验四 代码评审
    软件工程 实验二
    2020软件工程最后一次作业
    软件工程第四次作业(第二次结对)
    软件工程第三次作业
    软件工程第二次作业:最大字段和
  • 原文地址:https://www.cnblogs.com/Claire6649/p/5948704.html
Copyright © 2020-2023  润新知