
作者:天津九安特機電工程有限公司 來(lái)源: 天津九安特機電工程有限公司 日期:2026-05-05 09:22:38
自定義CompoundButton是定義一種非常實(shí)用(′?_?`)的功能,可(?_?;)以讓開(kāi)發(fā)者為Android應用提供更加豐富的定義界面和交互體驗,在自定義CompoundButton時(shí),定義我們通常會(huì )為其添加各種效果,定義如漣漪效果、定義點(diǎn)擊效果等,定義本文將介紹如何為Andro(??-)?id自定義Compoun(′▽?zhuān)?dButton添加漣漪效果。定義
漣漪效果的定義實(shí)現原理是利用遮罩層來(lái)模(╬?益?)擬水波擴散的過(guò)程,我們需要創(chuàng )建一個(gè)圓形的定義遮罩層,然后通過(guò)重繪的定義方式,讓遮罩層在CompoundButton被點(diǎn)擊時(shí)產(chǎn)生動(dòng)畫(huà)效果,定義具體步驟如下:
1、定義創(chuàng )建一個(gè)??圓形遮罩層;
2、定義為Compo??undButton設置點(diǎn)擊事件監聽(tīng)器;
3、定義在點(diǎn)擊事件中,定義獲取CompoundButton的位置信息;
4、根據位置??信息ヽ(′▽?zhuān)?ノ,計(′?_?`)算出需要繪制的圓形區域;
5、重繪遮罩層,生成漣漪效果。
下面我們來(lái)看一下具體的實(shí)現代碼:
public class RippleEffectB??utton extends CompoundButton { private static final int MAX_RADIUS = 100; // 漣漪最大半??徑 private static final int MIN_RADIUS = 30; // 漣漪最小半徑 private static final int ANIMATION_DURATION = 100; // 動(dòng)畫(huà)持續時(shí)間(毫秒) private Paint?? mPaint; // 畫(huà)筆 pri??vate Path mPath; // 路徑 private boolean mIsPressed; // 是否按下 public RippleE(°□°)ff??ectButton(Context context) { super(context); init(); } public( ???) RippleEffectButton(Contex(′?`*)t context, @Nullable AttributeSet at(′?`*)trs) { super(context, attrs); init(); } pub( ?▽?)lic RippleEffectButton(Context context, @Nullable AttributeSe(′?`)t(????) attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPai( ???)nt = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(Color.BLUE);?? // 可以設置(???)為其他顏色 mPaint.setStr(╬ ò﹏ó)okeWidth(10); // 可以設置為其他寬度 mPaint.setAlpha(255); // 不透明度,范圍0-255,可以設置為其他值 mPaint.setStrokeCa??p(Paint.Cap.ROUND); // 線(xiàn)帽樣式,這里設(′?ω?`)置為圓角線(xiàn)帽 mPaint.setStrokeJoin(Paint.Join.ROUND); // 線(xiàn)段連接樣式,這里設置為圓角連接點(diǎn) mPath = new Path(); // 初始化路徑對象 } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (!mIsPressed) return; // 如果沒(méi)有按下按鈕,直接返回不繪制漣漪效果 float radius = MAX_RADIUS * getWidth() * (MAX_RADIUS + MIN_RADIUS) * Math.abs(getTranslationX()) * Math.abs(g(????)etTran??slationY()) * (Math.abs(getTranslationX()) + Math.abs(getTranslationY())); // 根據位置計算半徑大小 int diameter = (int) (radiu??s * Math.sqrt(2)); // 將半徑轉換為直徑,用于設置圓角矩形的寬高比 int paddingLeft?? = getPaddingLeft() > diameter ? getPadd(╬ ò﹏ó)ingLeft() : diameter; // 確保圓角矩形的左上角在按鈕內部,避免超出按鈕邊界 int paddingTop = getPaddingTop() > diameter ? getPaddingTop() : diameter; // 確保圓角ヾ(′ω`)?矩形的左上角在按鈕內部,避免超出按鈕邊界 int paddingRight = getPaddingRight() < diameter + paddingLeft ? getPaddingRight() + pa(╬ ò﹏ó)ddingLeft + dia(′_ゝ`)meter: diameter + paddin??gLeft; // 確保ヽ(′?`)ノ圓角矩形的右下角在按鈕內部,避免超出按鈕邊界 int paddingBottom = getPaddingBottom() < diameter + paddingTop? getPaddingBottom() + paddingTop + diameter: dia(′?`)meter + padding(?????)Top; // 確保圓角矩形的右下角在按鈕內部,避免超出按鈕邊界 RectF rectF = new RectF(paddingLeft, paddingTop, pad??dingRight, paddingBottom); // 根據內邊距計算圓角矩形ヽ(′ー`)ノ(xing)的位置和大小 mPath.reset(??ヮ?)?*:???(); // 重置路徑對象 mPath.addRoundRect(rectF, MAX_RADIUS * getWidth(), MA?X_RADIUS * getHeight(), PathMeasure.MeasureMode.EXACTLY); // 根據圓角矩形的位置和大小(xiao)添加圓角矩形路徑 canvas.drawPath(mPath, mPaint); // 根據路徑繪制漣漪效果 }}通過(guò)上述代碼,我們成??功地實(shí)現了一個(gè)自定義的CompoundButton,并為其添加了漣漪效果,這種效果不僅美觀(guān),而且可以提高用戶(hù)的操作(zuo)體驗,當然,還有很多優(yōu)化的空間,例如可以根據不同的設備和系統版本調整漣漪效果的表現形式,希望本文能對您有所幫助。