Android學習之多點觸摸並不神秘

來源:互聯網
上載者:User

最近研究了一下多點觸摸,寫了個利用多點觸摸來控製圖片大小和單點觸摸控製圖片移動的程式,和大家分享分享。

 

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了。

接下來看程式,程式中有詳細的介紹:

 

package com.practice.imageviewpic;<br />import android.app.Activity;<br />import android.content.Context;<br />import android.graphics.*;<br />import android.graphics.drawable.BitmapDrawable;<br />import android.os.Bundle;<br />import android.view.MotionEvent;<br />import android.widget.ImageView;<br />import android.widget.ImageView.ScaleType;<br />public class ImageViewPic extends Activity {</p><p>/*<br /> * 利用多點觸控來控制ImageView中映像的放大與縮小<br /> * 手指控製圖片移動<br /> */</p><p>private MyImageView imageView;<br />private Bitmap bitmap;</p><p>//兩點觸屏後之間的長度<br />private float beforeLenght;<br />private float afterLenght;</p><p>//單點移動的前後座標值<br />private float afterX,afterY;<br />private float beforeX,beforeY;</p><p> /** Called when the activity is first created. */<br /> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> findView();<br /> setContentView(imageView);<br /> config();<br /> }</p><p> private void findView() {<br /> imageView = new MyImageView(this);<br /> //獲得圖片<br /> bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.xing)).getBitmap();<br /> }</p><p> private void config() {<br /> //設定imageView的顯示圖片<br /> imageView.setImageBitmap(bitmap);<br /> //設定圖片填充ImageView<br /> imageView.setScaleType(ScaleType.FIT_XY);<br /> }</p><p> //建立一個自己的ImageView類<br />class MyImageView extends ImageView {<br />private float scale = 0.1f;</p><p>public MyImageView(Context context) {<br />super(context);<br />}<br />//用來設定ImageView的位置<br />private void setLocation(int x,int y) {<br />this.setFrame(this.getLeft()+x, this.getTop()+y, this.getRight()+x, this.getBottom()+y);<br />}</p><p>/*<br /> * 用來放大縮小ImageView<br /> * 因為圖片是填充ImageView的,所以也就有放大縮小圖片的效果<br /> * flag為0是放大圖片,為1是小於圖片<br /> */<br />private void setScale(float temp,int flag) {</p><p>if(flag==0) {<br />this.setFrame(this.getLeft()-(int)(temp*this.getWidth()),<br /> this.getTop()-(int)(temp*this.getHeight()),<br /> this.getRight()+(int)(temp*this.getWidth()),<br /> this.getBottom()+(int)(temp*this.getHeight()));<br />}else {<br />this.setFrame(this.getLeft()+(int)(temp*this.getWidth()),<br /> this.getTop()+(int)(temp*this.getHeight()),<br /> this.getRight()-(int)(temp*this.getWidth()),<br /> this.getBottom()-(int)(temp*this.getHeight()));<br />}<br />}</p><p>//繪製邊框<br /> @Override<br /> protected void onDraw(Canvas canvas) {<br /> super.onDraw(canvas);<br /> Rect rec=canvas.getClipBounds();<br /> rec.bottom--;<br /> rec.right--;<br /> Paint paint=new Paint();<br /> paint.setColor(Color.RED);<br /> paint.setStyle(Paint.Style.STROKE);<br /> canvas.drawRect(rec, paint);<br /> }</p><p>/* 讓圖片跟隨手指觸屏的位置移動<br /> * beforeX、Y是用來儲存前一位置的座標<br /> * afterX、Y是用來儲存當前位置的座標<br /> * 它們的差值就是ImageView各座標的增加或減少值<br /> */<br />public void moveWithFinger(MotionEvent event) {</p><p>switch(event.getAction()) {</p><p>case MotionEvent.ACTION_DOWN:<br />beforeX = event.getX();<br />beforeY = event.getY();<br />break;<br />case MotionEvent.ACTION_MOVE:<br />afterX = event.getX();<br />afterY = event.getY();</p><p>this.setLocation((int)(afterX-beforeX),(int)(afterY-beforeY));</p><p>beforeX = afterX;<br />beforeY = afterY;<br />break;</p><p>case MotionEvent.ACTION_UP:<br />break;<br />}<br />}</p><p>/*<br /> * 通過多點觸屏放大或縮小映像<br /> * beforeLenght用來儲存前一時間兩點之間的距離<br /> * afterLenght用來儲存目前時間兩點之間的距離<br /> */<br />public void scaleWithFinger(MotionEvent event) {<br />float moveX = event.getX(1) - event.getX(0);<br />float moveY = event.getY(1) - event.getY(0);</p><p>switch(event.getAction()) {<br />case MotionEvent.ACTION_DOWN:<br />beforeLenght = (float) Math.sqrt( (moveX*moveX) + (moveY*moveY) );<br />break;<br />case MotionEvent.ACTION_MOVE:<br />//得到兩個點之間的長度<br />afterLenght = (float) Math.sqrt( (moveX*moveX) + (moveY*moveY) );</p><p>float gapLenght = afterLenght - beforeLenght;</p><p>if(gapLenght == 0) {<br />break;<br />}</p><p>//如果目前時間兩點距離大於前一時間兩點距離,則傳0,否則傳1<br />if(gapLenght>0) {<br />this.setScale(scale,0);<br />}else {<br />this.setScale(scale,1);<br />}</p><p>beforeLenght = afterLenght;<br />break;<br />}<br />}</p><p> }</p><p> //這裡來監聽螢幕觸控時間<br /> @Override<br />public boolean onTouchEvent(MotionEvent event) {</p><p> /*<br /> * 判定使用者是否觸摸到了圖片<br /> * 如果是單點觸摸則調用控製圖片移動的方法<br /> * 如果是2點觸控則調用控製圖片大小的方法<br /> */<br /> if(event.getY() > imageView.getTop() && event.getY() < imageView.getBottom()<br /> && event.getX() > imageView.getLeft() && event.getX() < imageView.getRight()) {<br /> if(event.getPointerCount() == 2) {<br /> imageView.scaleWithFinger(event);<br /> }else if(event.getPointerCount() == 1) {<br /> imageView.moveWithFinger(event);<br /> }<br /> }<br />return true;<br />}</p><p>} 

 

來源程式的為:http://download.csdn.net/source/3281618

 

謝謝大家,今天就到這裡了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.