【Android】自定义view-拖动小球移动
Android應用界面中可以看得見的都是由一個個的View所組成的,幾乎所有的可視的控件都是基于View寫的。在View中提供了對touch也就是手勢的捕獲和傳遞,我們可以對View里面手勢的重寫來達到我們所需要的特性。比如說我們現在要做一款游戲,內容很簡單,就是要實現讓如圖所示的一個黑色的小球在根據手指移動而在手機屏幕內移動。
我們可以重寫View里面的public boolean onTouchEvent(MotionEvent event)方法,來獲取到所有的手勢操作,再從中選擇出所需要的手勢進行操作。
所以可以得到如下的一段代碼:
/*** Created by obo on 15/8/21.*/ public class TouchView extends View{public static String TAG = TouchView.class.getCanonicalName();//當前小球的位置private PointF currrentPosition = new PointF(100,100);//手指觸摸起點坐標private PointF moveStartPosition = new PointF(0,0);//當前手指位置坐標private PointF moveEndPosition = new PointF(0,0);private Context context;public TouchView(Context context, AttributeSet attrs) {super(context, attrs);this.context = context;}@Overridepublic void onDraw(Canvas canvas){super.onDraw(canvas);canvas.drawCircle(currrentPosition.x + (moveEndPosition.x - moveStartPosition.x),currrentPosition.y+(moveEndPosition.y - moveStartPosition.y),50,new Paint());}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getActionMasked()){case MotionEvent.ACTION_DOWN:moveStartPosition.x = event.getX();moveStartPosition.y = event.getY();break;case MotionEvent.ACTION_MOVE:moveEndPosition.x = event.getX();moveEndPosition.y = event.getY();//刷新this.postInvalidate();break;case MotionEvent.ACTION_UP:currrentPosition.x += (moveEndPosition.x - moveStartPosition.x);currrentPosition.y += (moveEndPosition.y - moveStartPosition.y);moveStartPosition.x = moveEndPosition.x;moveStartPosition.y = moveEndPosition.y;break;default:}return true;} }可以看到當前onTouchEvent方法返回ture,表明這個View是要對當前手勢操作進行捕獲的,這里包括 按下、移動和抬起等相關操作,如果返回的是false的話,只會接收到第一次的一個ACTION_DOWN也就是按下的響應,之后的移動手勢和抬起的手勢都無法獲取到。
方法onTouchEvent里面做了三件事情:1.當用戶手指按下的時候,初始化記錄下開始按下的坐標,并立即返回不需要刷新界面。2.當用戶移動手指的時候,記錄用戶手指的位置,并且重新刷新界面。3.當用戶退出手勢也就是抬起手指的時候,將位移賦值給基礎坐標點,并讓手勢起點坐標和手勢終點坐標x、y相等(清零)。
而如果使用Matrix的話將會使整個過程變得更加簡單,只需要事先得到小球的bitmap就能使用matrix對小球進行包括 位移、形變、旋轉在內的變換,這里只使用matrix的位移變換效果,具體實現代碼如下:
/*** Created by obo on 15/8/26.*/ public class MatrixView extends View {public final static String TAG = MatrixView.class.getCanonicalName();//bitmap運行矩陣Matrix matrix = new Matrix();//記錄點PointF startPoint = new PointF();//自定義bitmapBitmap bitmap = Bitmap.createBitmap(100,100, Bitmap.Config.ARGB_8888);public MatrixView(Context context, AttributeSet attrs) {super(context, attrs);Canvas canvas = new Canvas(bitmap);//直接在bitmap上面繪制一個小球canvas.drawCircle(50,50,50,new Paint());}@Overridepublic void onDraw(Canvas canvas){super.onDraw(canvas);canvas.drawBitmap(bitmap, matrix, new Paint());}@Overridepublic boolean onTouchEvent(MotionEvent event){super.onTouchEvent(event);if (event.getActionMasked() == MotionEvent.ACTION_MOVE){matrix.postTranslate(event.getX() - startPoint.x, event.getY() - startPoint.y );//刷新this.postInvalidate();}startPoint.x = event.getX();startPoint.y = event.getY();return true;} }這一塊的代碼實現的效果和先前的一樣,增加了Matrix變量,少了一個PointF變量,同時在onTouchEvent和onDraw方法中的代碼量也降低了一些。Matrix其實是一個3X3的矩陣,使用Matrix可以一步步積累變換的操作,無論對matrix操作多少次,其對圖片的處理復雜度都是固定不變的,并且能對圖片進行快速的變換,這就是使用matrix的帶來的好處。
總結
以上是生活随笔為你收集整理的【Android】自定义view-拖动小球移动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring:如何用代码动态向容器中添加
- 下一篇: SQLServer错误:过程 sp_ad