Android自定義view之利用drawArc方法實現動態(tài)效果(思路詳解)
前言
前幾天看了一位字節(jié)Android工程師的一篇博客,他實現的是歌詞上下滾動的效果,實現的關鍵就是定義一個偏移量,然后根據情況去修改這個值,最后觸發(fā)View的重繪來達到效果。于是今天根據這個思路來寫一篇簡單的文章。歡迎留言
一、準備
在這之前呢,還是得簡單描述一下自定義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.自定義屬性
這個案例因為時間關系就不自定義屬性了,更多請參考本人以前的文章:Android自定義view之圍棋動畫
二、關鍵方法介紹
drawArc
此方法中共有五個參數
- oval :指定圓弧的外輪廓矩形區(qū)域。
- startAngle: 圓弧起始角度,單位為度。
- sweepAngle: 圓弧掃過的角度,順時針方向,單位為度,從右中間開始為零度。
- useCenter:為True時,在繪制圓弧時將圓心包括在內,通常用來繪制扇形。
- paint: 繪制圓弧的畫板屬性。
三.實現
1.思路
通過改變sweepAngle(上述方法第三個參數)的值,然后刷新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();
}
}
到此這篇關于Android自定義view之利用drawArc方法實現動態(tài)效果的文章就介紹到這了,更多相關Android自定義view實現動態(tài)效果內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解析在Android中為TextView增加自定義HTML標簽的實現方法
本篇文章是對在Android中為TextView增加自定義HTML標簽的方法進行了詳細的分析介紹。需要的朋友參考下2013-05-05
Android 屬性動畫ValueAnimator與插值器詳解
這篇文章主要介紹了Android 屬性動畫ValueAnimator與插值器詳解的相關資料,需要的朋友可以參考下2017-05-05
Flutter插件開發(fā)之HmsScanKit實現示例詳解
這篇文章主要為大家介紹了Flutter插件開發(fā)之HmsScanKit實現示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11

