Android自定義view之利用drawArc方法實現(xiàn)動態(tài)效果(思路詳解)
前言
前幾天看了一位字節(jié)Android工程師的一篇博客,他實現(xiàn)的是歌詞上下滾動的效果,實現(xiàn)的關(guān)鍵就是定義一個偏移量,然后根據(jù)情況去修改這個值,最后觸發(fā)View的重繪來達到效果。于是今天根據(jù)這個思路來寫一篇簡單的文章。歡迎留言
一、準備
在這之前呢,還是得簡單描述一下自定義view中的一些準備工作
1.測量
@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.自定義屬性
這個案例因為時間關(guān)系就不自定義屬性了,更多請參考本人以前的文章:Android自定義view之圍棋動畫
二、關(guān)鍵方法介紹
drawArc
此方法中共有五個參數(shù)
- oval :指定圓弧的外輪廓矩形區(qū)域。
- startAngle: 圓弧起始角度,單位為度。
- sweepAngle: 圓弧掃過的角度,順時針方向,單位為度,從右中間開始為零度。
- useCenter:為True時,在繪制圓弧時將圓心包括在內(nèi),通常用來繪制扇形。
- paint: 繪制圓弧的畫板屬性。
三.實現(xiàn)
1.思路
通過改變sweepAngle(上述方法第三個參數(shù))的值,然后刷新View來達到效果
代碼如下:
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();
//定義一個最小標識
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方法實現(xiàn)動態(tài)效果的文章就介紹到這了,更多相關(guān)Android自定義view實現(xiàn)動態(tài)效果內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android Java調(diào)用自己C++類庫的實例講解
今天小編就為大家分享一篇關(guān)于Android Java調(diào)用自己C++類庫的實例講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02
Android中網(wǎng)絡(luò)框架簡單封裝的實例方法
在本篇文章里小編給大家整理的是關(guān)于Android中網(wǎng)絡(luò)框架簡單封裝的實例方法,需要的朋友們可以學(xué)習(xí)下。2020-03-03
Android NDK開發(fā)(C語言--動態(tài)內(nèi)存分配)
這篇文章主要介紹了Android NDK開發(fā) C語言--動態(tài)內(nèi)存分配2021-12-12
android?studio實現(xiàn)上傳圖片到j(luò)ava服務(wù)器
這篇文章主要為大家詳細介紹了android?studio實現(xiàn)上傳圖片到j(luò)ava服務(wù)器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08
Android開發(fā)Input系統(tǒng)觸摸事件分發(fā)
這篇文章主要為大家介紹了Android開發(fā)Input系統(tǒng)觸摸事件分發(fā)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03

