您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)怎么在A(yíng)ndroid中利用view實(shí)現(xiàn)一個(gè)拖動(dòng)功能,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
Android應(yīng)用界面中可以看得見(jiàn)的都是由一個(gè)個(gè)的View所組成的,幾乎所有的可視的控件都是基于View寫(xiě)的。在View中提供了對(duì)touch也就是手勢(shì)的捕獲和傳遞,我們可以對(duì)View里面手勢(shì)的重寫(xiě)來(lái)達(dá)到我們所需要的特性。比如說(shuō)我們現(xiàn)在要做一款游戲,內(nèi)容很簡(jiǎn)單,就是要實(shí)現(xiàn)讓如圖所示的一個(gè)黑色的小球在根據(jù)手指移動(dòng)而在手機(jī)屏幕內(nèi)移動(dòng)。
我們可以重寫(xiě)View里面的public boolean onTouchEvent(MotionEvent event)方法,來(lái)獲取到所有的手勢(shì)操作,再?gòu)闹羞x擇出所需要的手勢(shì)進(jìn)行操作。
所以可以得到如下的一段代碼:
/** * Created by obo on 15/8/21. */ public class TouchView extends View{ public static String TAG = TouchView.class.getCanonicalName(); //當(dāng)前小球的位置 private PointF currrentPosition = new PointF(100,100); //手指觸摸起點(diǎn)坐標(biāo) private PointF moveStartPosition = new PointF(0,0); //當(dāng)前手指位置坐標(biāo) private PointF moveEndPosition = new PointF(0,0); private Context context; public TouchView(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawCircle(currrentPosition.x + (moveEndPosition.x - moveStartPosition.x),currrentPosition.y+(moveEndPosition.y - moveStartPosition.y),50,new Paint()); } @Override public 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; } }
可以看到當(dāng)前onTouchEvent方法返回ture,表明這個(gè)View是要對(duì)當(dāng)前手勢(shì)操作進(jìn)行捕獲的,這里包括 按下、移動(dòng)和抬起等相關(guān)操作,如果返回的是false的話(huà),只會(huì)接收到第一次的一個(gè)ACTION_DOWN也就是按下的響應(yīng),之后的移動(dòng)手勢(shì)和抬起的手勢(shì)都無(wú)法獲取到。
方法onTouchEvent里面做了三件事情:1.當(dāng)用戶(hù)手指按下的時(shí)候,初始化記錄下開(kāi)始按下的坐標(biāo),并立即返回不需要刷新界面。2.當(dāng)用戶(hù)移動(dòng)手指的時(shí)候,記錄用戶(hù)手指的位置,并且重新刷新界面。3.當(dāng)用戶(hù)退出手勢(shì)也就是抬起手指的時(shí)候,將位移賦值給基礎(chǔ)坐標(biāo)點(diǎn),并讓手勢(shì)起點(diǎn)坐標(biāo)和手勢(shì)終點(diǎn)坐標(biāo)x、y相等(清零)。
而如果使用Matrix的話(huà)將會(huì)使整個(gè)過(guò)程變得更加簡(jiǎn)單,只需要事先得到小球的bitmap就能使用matrix對(duì)小球進(jìn)行包括 位移、形變、旋轉(zhuǎn)在內(nèi)的變換,這里只使用matrix的位移變換效果,具體實(shí)現(xiàn)代碼如下:
/** * Created by obo on 15/8/26. */ public class MatrixView extends View { public final static String TAG = MatrixView.class.getCanonicalName(); //bitmap運(yùn)行矩陣 Matrix matrix = new Matrix(); //記錄點(diǎn) PointF startPoint = new PointF(); //自定義bitmap Bitmap bitmap = Bitmap.createBitmap(100,100, Bitmap.Config.ARGB_8888); public MatrixView(Context context, AttributeSet attrs) { super(context, attrs); Canvas canvas = new Canvas(bitmap); //直接在bitmap上面繪制一個(gè)小球 canvas.drawCircle(50,50,50,new Paint()); } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(bitmap, matrix, new Paint()); } @Override public 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; } }
這一塊的代碼實(shí)現(xiàn)的效果和先前的一樣,增加了Matrix變量,少了一個(gè)PointF變量,同時(shí)在onTouchEvent和onDraw方法中的代碼量也降低了一些。Matrix其實(shí)是一個(gè)3X3的矩陣,使用Matrix可以一步步積累變換的操作,無(wú)論對(duì)matrix操作多少次,其對(duì)圖片的處理復(fù)雜度都是固定不變的,并且能對(duì)圖片進(jìn)行快速的變換,這就是使用matrix的帶來(lái)的好處。
關(guān)于怎么在A(yíng)ndroid中利用view實(shí)現(xiàn)一個(gè)拖動(dòng)功能就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。