最近研究了一下多点触摸,写了个利用多点触摸来控制图片大小和单点触摸控制图片移动的程序,和大家分享分享。

 

Android中监听触摸事件是onTouchEvent方法,它的参数为MotionEvent,下面列举MotionEvent的一些常用的方法:

getPointerCount() 获得触屏的点数。

getX() 获得触屏的X坐标值

getY() 获得触屏的Y坐标值

getAction() 获得触屏的动作

ACTION_DOWN:按下的动作开始,比如用手指按屏幕。

ACTION_UP:按下的动作完成,比如手指停止按屏幕,离开屏幕。

ACTION_MOVE:在动作开始和完成之间的移动,比如手指在屏幕上滑动。

 

还介绍下程序中用到的ImageView,ImageView.setFrame()的四个参数指的是left,top,right,bottom如图:

left和top指的就是ImageView左上角的坐标x和y,right,bottom指的就是ImageView的右下角的坐标x和y了。

接下来看程序,程序中有详细的介绍:

    1. package
    2. import
    3. import
    4. import
    5. import
    6. import
    7. import
    8. import
    9. import
    10. public class ImageViewPic extends
    11.       
    12. /*
    13.      * 利用多点触控来控制ImageView中图像的放大与缩小
    14.      * 手指控制图片移动
    15.      */
    16.       
    17. private
    18. private
    19.       
    20. //两点触屏后之间的长度 
    21. private float
    22. private float
    23.       
    24. //单点移动的前后坐标值 
    25. private float
    26. private float
    27.       
    28. /** Called when the activity is first created. */
    29. @Override
    30. public void
    31. super.onCreate(savedInstanceState);  
    32.         findView();  
    33.         setContentView(imageView);  
    34.         config();  
    35.     }  
    36.       
    37. private void
    38. new MyImageView(this);  
    39. //获得图片 
    40.         bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.xing)).getBitmap();  
    41.     }  
    42.       
    43. private void
    44. //设置imageView的显示图片 
    45.         imageView.setImageBitmap(bitmap);  
    46. //设置图片填充ImageView 
    47.         imageView.setScaleType(ScaleType.FIT_XY);  
    48.     }  
    49.       
    50. //创建一个自己的ImageView类 
    51. class MyImageView extends
    52. private float scale = 0.1f;  
    53.           
    54. public
    55. super(context);  
    56.         }  
    57. //用来设置ImageView的位置 
    58. private void setLocation(int x,int
    59. this.setFrame(this.getLeft()+x, this.getTop()+y, this.getRight()+x, this.getBottom()+y);  
    60.         }  
    61.           
    62.           
    63. /*
    64.          * 用来放大缩小ImageView
    65.          * 因为图片是填充ImageView的,所以也就有放大缩小图片的效果
    66.          * flag为0是放大图片,为1是小于图片
    67.          */
    68. private void setScale(float temp,int
    69.               
    70. if(flag==0) {  
    71. this.setFrame(this.getLeft()-(int)(temp*this.getWidth()),   
    72. this.getTop()-(int)(temp*this.getHeight()),   
    73. this.getRight()+(int)(temp*this.getWidth()),   
    74. this.getBottom()+(int)(temp*this.getHeight()));     
    75. else
    76. this.setFrame(this.getLeft()+(int)(temp*this.getWidth()),   
    77. this.getTop()+(int)(temp*this.getHeight()),   
    78. this.getRight()-(int)(temp*this.getWidth()),   
    79. this.getBottom()-(int)(temp*this.getHeight()));  
    80.             }  
    81.         }  
    82.           
    83. //绘制边框       
    84. @Override
    85. protected void
    86. super.onDraw(canvas);      
    87.               Rect rec=canvas.getClipBounds();  
    88.               rec.bottom--;  
    89.               rec.right--;  
    90. new
    91.               paint.setColor(Color.RED);  
    92.               paint.setStyle(Paint.Style.STROKE);  
    93.               canvas.drawRect(rec, paint);  
    94.           }  
    95.           
    96.            
    97. /* 让图片跟随手指触屏的位置移动
    98.          * beforeX、Y是用来保存前一位置的坐标
    99.          * afterX、Y是用来保存当前位置的坐标
    100.          * 它们的差值就是ImageView各坐标的增加或减少值
    101.          */
    102. public void
    103.               
    104. switch(event.getAction()) {  
    105.               
    106. case
    107.                 beforeX = event.getX();  
    108.                 beforeY = event.getY();  
    109. break;  
    110. case
    111.                 afterX = event.getX();  
    112.                 afterY = event.getY();  
    113.                   
    114. this.setLocation((int)(afterX-beforeX),(int)(afterY-beforeY));  
    115.                   
    116.                 beforeX = afterX;  
    117.                 beforeY = afterY;  
    118. break;  
    119.                   
    120. case
    121. break;  
    122.             }  
    123.         }  
    124.           
    125. /*
    126.          * 通过多点触屏放大或缩小图像
    127.          * beforeLenght用来保存前一时间两点之间的距离
    128.          * afterLenght用来保存当前时间两点之间的距离
    129.          */
    130. public void
    131. float moveX = event.getX(1) - event.getX(0);  
    132. float moveY = event.getY(1) - event.getY(0);  
    133.               
    134. switch(event.getAction()) {  
    135. case
    136. float) Math.sqrt( (moveX*moveX) + (moveY*moveY) );  
    137. break;  
    138. case
    139. //得到两个点之间的长度 
    140. float) Math.sqrt( (moveX*moveX) + (moveY*moveY) );  
    141.                   
    142. float
    143.                   
    144. if(gapLenght == 0) {  
    145. break;  
    146.                 }  
    147.                   
    148. //如果当前时间两点距离大于前一时间两点距离,则传0,否则传1
    149. if(gapLenght>0) {  
    150. this.setScale(scale,0);  
    151. else
    152. this.setScale(scale,1);  
    153.                 }  
    154.                   
    155.                 beforeLenght = afterLenght;  
    156. break;  
    157.             }  
    158.         }  
    159.        
    160.     }  
    161.       
    162. //这里来监听屏幕触控时间 
    163. @Override
    164. public boolean
    165.          
    166. /*
    167.         * 判定用户是否触摸到了图片
    168.         * 如果是单点触摸则调用控制图片移动的方法
    169.         * 如果是2点触控则调用控制图片大小的方法
    170.         */
    171. if(event.getY() > imageView.getTop() && event.getY() < imageView.getBottom()  
    172.                 && event.getX() > imageView.getLeft() && event.getX() < imageView.getRight()) {  
    173. if(event.getPointerCount() == 2) {  
    174.                 imageView.scaleWithFinger(event);  
    175. else if(event.getPointerCount() == 1) {  
    176.                 imageView.moveWithFinger(event);  
    177.             }             
    178.         }  
    179. return true;  
    180.     }         
    181.       
    182. }