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

