新聞中心
這篇文章給大家分享的是有關Android如何自定義視圖實現手指移動軌跡的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
華寧網站建設公司創(chuàng)新互聯(lián),華寧網站設計制作,有大型網站制作公司豐富經驗。已為華寧1000多家提供企業(yè)網站建設服務。企業(yè)網站搭建\成都外貿網站建設要多少錢,請找那個售后服務好的華寧做網站的公司定做!
一、什么是貝塞爾曲線
貝塞爾曲線(Bézier curve),又稱貝茲曲線或貝濟埃曲線,是應用于二維圖形應用程序的數學曲線。一般的矢量圖形軟件通過它來精確畫出曲線,貝茲曲線由線段與節(jié)點組成,節(jié)點是可拖動的支點,線段像可伸縮的皮筋,我們在繪圖工具上看到的鋼筆工具就是來做這種矢量曲線的。貝塞爾曲線是計算機圖形學中相當重要的參數曲線,在一些比較成熟的位圖軟件中也有貝塞爾曲線工具,如PhotoShop等。
二、貝塞爾曲線公式
三、手指軌跡原理
因為這個我們用的是自定義控件,所以我們創(chuàng)建一個finger的類集成View,重寫onDraw onTouchEvent這個兩個方法
public finger(Context context, @Nullable AttributeSet attrs)需要這個構造方法
其實手指軌跡的原理也很簡單,就是通過onTouchEvent來獲取道手指的位置,來繪制path路徑即可。
四、分析代碼
這里我先寫出全部的代碼,后面我再來一一分析代碼的作用:
全部代碼:
package com.campus.shopping.drawtext; import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View; /** * Created by sang on 2018/6/24. */ public class MyView extends View { private Path mPath = new Path(); private float mPreX,mPreY; public MyView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { mPath.moveTo(event.getX(), event.getY()); mPreX = event.getX(); mPreY = event.getY(); return true; } case MotionEvent.ACTION_MOVE: float endX = (mPreX+event.getX())/2; float endY = (mPreY+event.getY())/2; mPath.quadTo(mPreX,mPreY,endX,endY); mPreX = event.getX(); mPreY = event.getY(); invalidate(); break; default: break; } return super.onTouchEvent(event); } public void reset(){ mPath.reset(); invalidate(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setColor(Color.WHITE); paint.setStyle(Paint.Style.STROKE); canvas.drawPath(mPath, paint); }}
onTouchEvent方法:
public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { mPath.moveTo(event.getX(), event.getY()); mPreX = event.getX(); mPreY = event.getY(); return true; } case MotionEvent.ACTION_MOVE: float endX = (mPreX+event.getX())/2; float endY = (mPreY+event.getY())/2; mPath.quadTo(mPreX,mPreY,endX,endY); mPreX = event.getX(); mPreY = event.getY(); invalidate(); break; default: break; } return super.onTouchEvent(event); }
當手指按下觸發(fā)了ACTION_DOWN時,這里我通過moveTo的方法繪制了第一個點,這個必須使用moveTo,因為如果不使用這個這個點將會在(0,0)開始,最后我們回去到xy點作為控制點,最后使用返回 真的方式讓ACTION_MOVE,ACTION_UP事件往這個控件繼續(xù)傳遞事件。
再來看當觸發(fā)ACTION_MOVE時,因為貝塞爾曲線是由線段構成的,結束點時在線段的中間的位置,所以這里的計算方法是(起點+最后的點)/2就可以得到中間的點.
使用方式:
感謝各位的閱讀!關于“Android如何自定義視圖實現手指移動軌跡”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
文章名稱:Android如何自定義視圖實現手指移動軌跡
路徑分享:http://www.ef60e0e.cn/article/pdgcge.html