Android自定義view之利用drawArc方法實(shí)現(xiàn)動(dòng)態(tài)效果(思路詳解)
前言
前幾天看了一位字節(jié)Android工程師的一篇博客,他實(shí)現(xiàn)的是歌詞上下滾動(dòng)的效果,實(shí)現(xiàn)的關(guān)鍵就是定義一個(gè)偏移量,然后根據(jù)情況去修改這個(gè)值,最后觸發(fā)View的重繪來(lái)達(dá)到效果。于是今天根據(jù)這個(gè)思路來(lái)寫一篇簡(jiǎn)單的文章。歡迎留言
一、準(zhǔn)備
在這之前呢,還是得簡(jiǎn)單描述一下自定義view中的一些準(zhǔn)備工作
1.測(cè)量
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mWidth = w; mHeight = h; useWidth = mWidth; if (mWidth > mHeight) { useWidth = mHeight; } }
2.初始化畫筆
private void initPaint() { //初始化 mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(0x88FF0000); mPaint.setStrokeWidth(4); //初始化 mFramePaint = new Paint(); mFramePaint.setAntiAlias(true); mFramePaint.setStyle(Paint.Style.STROKE); mFramePaint.setStrokeWidth(0); }
3.自定義屬性
這個(gè)案例因?yàn)闀r(shí)間關(guān)系就不自定義屬性了,更多請(qǐng)參考本人以前的文章:Android自定義view之圍棋動(dòng)畫
二、關(guān)鍵方法介紹
drawArc
此方法中共有五個(gè)參數(shù)
- oval :指定圓弧的外輪廓矩形區(qū)域。
- startAngle: 圓弧起始角度,單位為度。
- sweepAngle: 圓弧掃過(guò)的角度,順時(shí)針?lè)较?,單位為?從右中間開(kāi)始為零度。
- useCenter:為True時(shí),在繪制圓弧時(shí)將圓心包括在內(nèi),通常用來(lái)繪制扇形。
- paint: 繪制圓弧的畫板屬性。
三.實(shí)現(xiàn)
1.思路
通過(guò)改變sweepAngle(上述方法第三個(gè)參數(shù))的值,然后刷新View來(lái)達(dá)到效果
代碼如下:
mSweep += SWEEP_INC; if (mSweep > 360) { mSweep -= 360; } //刷新View invalidate();
2.效果圖
源碼
MySampleView.java
public class MySampleView extends View { private int mWidth; private int mHeight; private int useWidth, minwidth; private Paint mPaint; private Paint mFramePaint; private RectF mBigOval; private float mStart; private float mSweep; private static final float SWEEP_INC = 2; public MySampleView(Context context) { super(context); } public MySampleView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public MySampleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public MySampleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } private void init() { initPaint(); } private void initPaint() { //初始化 mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(0x88FF0000); mPaint.setStrokeWidth(4); //初始化 mFramePaint = new Paint(); mFramePaint.setAntiAlias(true); mFramePaint.setStyle(Paint.Style.STROKE); mFramePaint.setStrokeWidth(0); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mWidth = w; mHeight = h; useWidth = mWidth; if (mWidth > mHeight) { useWidth = mHeight; } } @Override protected void onDraw(Canvas canvas) { init(); //定義一個(gè)最小標(biāo)識(shí) minwidth = useWidth / 10; mBigOval = new RectF(minwidth, minwidth, minwidth*9, minwidth*9); //繪制背景 canvas.drawColor(Color.WHITE); canvas.drawRect(mBigOval, mFramePaint); canvas.drawArc(mBigOval, mStart, mSweep, true, mPaint); mSweep += SWEEP_INC; if (mSweep > 360) { mSweep -= 360; } //刷新View invalidate(); } }
到此這篇關(guān)于Android自定義view之利用drawArc方法實(shí)現(xiàn)動(dòng)態(tài)效果的文章就介紹到這了,更多相關(guān)Android自定義view實(shí)現(xiàn)動(dòng)態(tài)效果內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android使用ListView實(shí)現(xiàn)滾輪的動(dòng)畫效果實(shí)例
這篇文章主要介紹了Android使用ListView實(shí)現(xiàn)滾輪的動(dòng)畫效果實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06分析CmProcess跨進(jìn)程通信的實(shí)現(xiàn)
CmProcess是Android一個(gè)跨進(jìn)程通信框架,無(wú)需進(jìn)行bindService()操作,不用定義Service,也不需要定義aidl。 支持IPC級(jí)的 Callback,并且支持跨進(jìn)程的事件總線,可同步獲取服務(wù),采用面向接口方式進(jìn)行服務(wù)注冊(cè)與調(diào)用,服務(wù)調(diào)用方和使用者完全解耦2021-06-06解析在Android中為TextView增加自定義HTML標(biāo)簽的實(shí)現(xiàn)方法
本篇文章是對(duì)在Android中為TextView增加自定義HTML標(biāo)簽的方法進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下2013-05-05Android SeekBar實(shí)現(xiàn)禁止滑動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android SeekBar實(shí)現(xiàn)禁止滑動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03Android 屬性動(dòng)畫ValueAnimator與插值器詳解
這篇文章主要介紹了Android 屬性動(dòng)畫ValueAnimator與插值器詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05Flutter插件開(kāi)發(fā)之HmsScanKit實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了Flutter插件開(kāi)發(fā)之HmsScanKit實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11