Android自定義View制作動(dòng)態(tài)炫酷按鈕實(shí)例解析
普通按鈕也就那么幾種樣式,看著都審美疲勞,先放效果圖:
你會(huì)不會(huì)以為這個(gè)按鈕是集結(jié)了很多動(dòng)畫(huà)的產(chǎn)物,我告訴你,并沒(méi)有。所有的實(shí)現(xiàn)都是基于自定義View,采用最底層的onDraw一點(diǎn)一點(diǎn)的畫(huà)出來(lái)的。沒(méi)有采用一丁點(diǎn)的動(dòng)畫(huà)。雖然演示時(shí)間很短,但是要完成這么多變化,還是挺吃力。
首先講解用法:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final AnimationButton button = (AnimationButton) findViewById(R.id.button);
// button.setTextSizeTouch(25); //設(shè)置按下時(shí)字體的大小,不設(shè)置有默認(rèn)值
// button.setStrokeProgress(10); //設(shè)置進(jìn)度條的厚度,不設(shè)置有默認(rèn)值
// button.setColorBase(Color.GREEN); //設(shè)置整體基色,不設(shè)置有默認(rèn)值
// button.setColorBack(Color.GRAY); //設(shè)置進(jìn)度條的背景色,不設(shè)置有默認(rèn)值
// button.setStroke(3); //設(shè)置邊框的厚度,不設(shè)置有默認(rèn)值
// button.setStrokeText(0); //設(shè)置文本的厚度,不設(shè)置有默認(rèn)值
// button.setTextSize(30); //設(shè)置文本的字體大小,不設(shè)置有默認(rèn)值
// button.setRound(30); //設(shè)置圓角,不設(shè)置有默認(rèn)值
button.setText("登錄"); //設(shè)置文本,不設(shè)置有默認(rèn)值
button.setMode(AnimationButton.Mode.Hand_Finish); //設(shè)置進(jìn)度條模式,不設(shè)置有默認(rèn)值Mode.Auto_Finish
button.setOnAnimationButtonClickListener(new AnimationButton.OnAnimationButtonClickListener() {
@Override
public void onClick() {
//stopProgress方法 僅僅在button.setMode(AnimationButton.Mode.Hand_Finish);之后才有效。
button.stopProgress();
}
});
}
}
其實(shí)如果只需要最普通的功能,根本什么都不用做。因?yàn)閹缀跛械膮?shù)都已經(jīng)設(shè)置了固定內(nèi)設(shè)置。在上面注釋掉的函數(shù)用法也是用戶唯一能用的幾個(gè)函數(shù),其他函數(shù)雖然標(biāo)示為public,但是卻是因?yàn)榻M件之內(nèi)的方法傳遞,而不是給外界用戶調(diào)用的。因此大家如果想自定義樣式,可以調(diào)用注釋里的方法。
下面開(kāi)始源碼講解,首先分解功能,所有的變化可以分為三個(gè)狀態(tài):
1、默認(rèn)狀態(tài),也就是最初的狀態(tài)。主要完成的事情為:接收用戶的點(diǎn)擊,改變背景的樣式從空心變?yōu)閷?shí)心,動(dòng)態(tài)改變文本的大小,然后就是逐漸得縮小成一個(gè)圓。
2、進(jìn)度條狀態(tài)。主要完成進(jìn)度條的遞進(jìn),演示圖上只轉(zhuǎn)了一圈。其實(shí)可以通過(guò)設(shè)置一個(gè)參數(shù),轉(zhuǎn)動(dòng)多圈直到用戶手動(dòng)停止,甚至無(wú)限轉(zhuǎn)動(dòng)
3、結(jié)束狀態(tài)。主要完成由圓的狀態(tài)變回圓角矩形的狀態(tài),并呈現(xiàn)中間的Logo
既然分割出了狀態(tài),那么就采用狀態(tài)機(jī)+代理模式來(lái)實(shí)現(xiàn)這個(gè)功能吧。首先是狀態(tài)的枚舉。
/**
* Created by ccwxf on 2016/2/29.
* 用于區(qū)別狀態(tài),有:默認(rèn)狀態(tài)、進(jìn)度條狀態(tài)、結(jié)束狀態(tài)
*/
public enum Status {
Default,
Progress,
Finish
}
然后是狀態(tài)機(jī)的接口,也就是所有的狀態(tài)需要完成的共同的事情:
/**
* Created by ccwxf on 2016/2/29.
*/
public interface ButtonStatus {
/**
* @return 對(duì)應(yīng)的Status值
*/
Status getStatus();
/**
* 這個(gè)狀態(tài)的事件處理代理
* @param mEvent
* @return
*/
boolean onTouchEvent(MotionEvent mEvent);
/**
* 這個(gè)狀態(tài)的繪制代理
* @param mCanvas
* @param mPaint
*/
void onDraw(Canvas mCanvas, Paint mPaint);
}
然后我們實(shí)現(xiàn)按鈕的代碼,也就是自定義View:
/**
* Created by ccwxf on 2016/2/29.
*/
public class AnimationButton extends View {
private static int Color_Base = Color.rgb(24, 204, 149);
private static int Color_Back = Color.rgb(153, 153, 153);
private static int Stroke = 3;
private static int Stroke_Text = 0;
private static int Stroke_Progress = 10;
private static int Text_Size = 30;
private static int Text_Size_Touch = 25;
private static int Round = 30;
private static String Text = "提交";
private Mode mode = Mode.Auto_Finish;
private int maxWidth;
private int maxHeight;
private int colorBase = Color_Base;
private int colorBack = Color_Back;
private int stroke = Stroke;
private int strokeText = Stroke_Text;
private int strokeProgress = Stroke_Progress;
private int textSize = Text_Size;
private int textSizeTouch = Text_Size_Touch;
private int round = Round;
private String text = Text;
//是否停止進(jìn)度條,由外界設(shè)置
private boolean isProgressStop = false;
private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private ButtonStatus status;
private OnAnimationButtonClickListener listener;
public Mode getMode() {
return mode;
}
public void setMode(Mode mode) {
this.mode = mode;
}
public int getMaxWidth() {
return maxWidth;
}
public int getMaxHeight() {
return maxHeight;
}
public int getTextSizeTouch() {
return textSizeTouch;
}
public void setTextSizeTouch(int textSizeTouch) {
this.textSizeTouch = textSizeTouch;
}
public int getStrokeProgress() {
return strokeProgress;
}
public void setStrokeProgress(int strokeProgress) {
this.strokeProgress = strokeProgress;
}
public int getColorBase() {
return colorBase;
}
public void setColorBase(int colorBase) {
this.colorBase = colorBase;
}
public int getColorBack() {
return colorBack;
}
public void setColorBack(int colorBack) {
this.colorBack = colorBack;
}
public int getStroke() {
return stroke;
}
public void setStroke(int stroke) {
this.stroke = stroke;
}
public int getStrokeText() {
return strokeText;
}
public void setStrokeText(int strokeText) {
this.strokeText = strokeText;
}
public int getTextSize() {
return textSize;
}
public void setTextSize(int textSize) {
this.textSize = textSize;
}
public int getRound() {
return round;
}
public void setRound(int round) {
this.round = round;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public AnimationButton(Context context) {
super(context);
}
public AnimationButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AnimationButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (status != null) {
return status.onTouchEvent(event);
}
return super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas canvas) {
if (status != null) {
status.onDraw(canvas, mPaint);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
maxWidth = MeasureSpec.getSize(widthMeasureSpec);
maxHeight = MeasureSpec.getSize(heightMeasureSpec);
if (maxWidth != 0 && maxHeight != 0) {
status = new DefaultStatus(this, maxWidth, maxHeight);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
/**
* 改變整體狀態(tài)
*
* @param s 改變的狀態(tài)
* @param width 目前的寬度
* @param height 目前的高度
*/
public void changeStatus(Status s, int width, int height, int centerX, int centerY) {
switch (s) {
case Default:
break;
case Progress:
//改變狀態(tài),進(jìn)入進(jìn)度條狀態(tài)
status = new ProgressStatus(this, width, height, centerX, centerY);
invalidate();
break;
case Finish:
//進(jìn)入結(jié)束狀態(tài)
status = new FinishStatus(this, width, height, centerX, centerY);
invalidate();
break;
}
}
/**
* 外界設(shè)置停止進(jìn)度條
*/
public void stopProgress(){
this.isProgressStop = true;
}
/**
* 檢查是否進(jìn)度條結(jié)束
* @return
*/
public boolean isProgressStop(){
return isProgressStop;
}
public enum Mode{
Auto_Finish,
Hand_Finish
}
public interface OnAnimationButtonClickListener{
void onClick();
}
public void setOnAnimationButtonClickListener(OnAnimationButtonClickListener listener){
this.listener = listener;
}
public OnAnimationButtonClickListener getOnAnimationButtonClickListener(){
return listener;
}
}
上面實(shí)現(xiàn)了一堆的變量參數(shù)供用戶自定義。然后在onTouchEvent和onDraw方法中,將所有操作都代理出去。
然后我們來(lái)實(shí)現(xiàn)第一個(gè)狀態(tài),也就是默認(rèn)狀態(tài):
/**
* Created by ccwxf on 2016/2/29.
*/
public class DefaultStatus implements ButtonStatus {
//分別表示處于默認(rèn)狀態(tài)內(nèi)部的四個(gè)子狀態(tài)
private static final int Status_Default = 0;
private static final int Status_Touch = 1;
private static final int Status_Up = 2;
private static final int Status_Next = 3;
//刷新width時(shí)的漸變量以及時(shí)間間距
private static final int Delay_Next = 500;
private static final int Delay_Frush = 10;
private static final int Pixel_Frush = 8;
//按鈕對(duì)象
private AnimationButton button;
//按鈕對(duì)象的長(zhǎng)寬與中點(diǎn)坐標(biāo)(長(zhǎng)寬為繪制的長(zhǎng)寬,而不是控件的長(zhǎng)寬)
private int width;
private int height;
private int centerX;
private int centerY;
//子狀態(tài)變量
private int status = Status_Default;
private Handler handler = new Handler();
public DefaultStatus(AnimationButton button, int width, int height) {
this.button = button;
this.width = width;
this.height = height;
this.centerX = width / 2;
this.centerY = height / 2;
}
@Override
public Status getStatus() {
return Status.Default;
}
@Override
public boolean onTouchEvent(MotionEvent mEvent) {
switch (mEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
//按下時(shí),切換到按下子狀態(tài)
if(status == Status_Default){
status = Status_Touch;
button.invalidate();
}
return true;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
//抬起時(shí),或者移除控件時(shí),切換到抬起子狀態(tài)
if(status == Status_Touch){
status = Status_Up;
button.invalidate();
//過(guò)500ms延遲后開(kāi)始進(jìn)行伸縮變化
handler.postDelayed(new Runnable() {
@Override
public void run() {
//切換到next子狀態(tài)
if(status == Status_Up){
status = Status_Next;
}
if(status == Status_Next){
//若長(zhǎng)寬不一致,則繼續(xù)漸變,否則改變狀態(tài)
if (width >= height) {
width -= Pixel_Frush;
button.invalidate();
handler.postDelayed(this, Delay_Frush);
}else{
button.changeStatus(Status.Progress, width, height, centerX, centerY);
}
}
}
}, Delay_Next);
//響應(yīng)監(jiān)聽(tīng)器
AnimationButton.OnAnimationButtonClickListener listener = button.getOnAnimationButtonClickListener();
if(listener != null){
listener.onClick();
}
}
break;
}
return false;
}
@Override
public void onDraw(Canvas mCanvas, Paint mPaint) {
switch (status) {
case Status_Default:
onDrawDefault(mCanvas, mPaint);
break;
case Status_Touch:
onDrawTouch(mCanvas, mPaint);
break;
case Status_Up:
onDrawUp(mCanvas, mPaint);
break;
case Status_Next:
onDrawNext(mCanvas, mPaint);
break;
}
}
/**
* 繪制邊框,分為空心和實(shí)心兩種
*
* @param mCanvas 畫(huà)布
* @param mPaint 畫(huà)筆
* @param style 空心或者實(shí)心
* @param padding 邊框補(bǔ)白
*/
private void drawRound(Canvas mCanvas, Paint mPaint, Paint.Style style, int padding) {
mPaint.setColor(button.getColorBase());
int stroke = padding;
if (style == Paint.Style.STROKE) {
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(button.getStroke());
stroke += button.getStroke() / 2;
} else {
mPaint.setStyle(Paint.Style.FILL);
}
//繪制邊框
mCanvas.drawRoundRect(new RectF(stroke, stroke, width - stroke, height - stroke), button.getRound(), button.getRound(), mPaint);
}
/**
* 畫(huà)文字,有字體大小和顏色的區(qū)別
*
* @param mCanvas 畫(huà)布
* @param mPaint 畫(huà)筆
* @param textSize 字體大小
* @param textColor 字體顏色
*/
private void drawText(Canvas mCanvas, Paint mPaint, int textSize, int textColor) {
mPaint.setColor(textColor);
mPaint.setStrokeWidth(button.getStrokeText());
mPaint.setTextSize(textSize);
Paint.FontMetrics metrics = mPaint.getFontMetrics();
int textWidth = (int) mPaint.measureText(button.getText());
int baseLine = (int) (height / 2 + (metrics.bottom - metrics.top) / 2 - metrics.bottom);
mCanvas.drawText(button.getText(), (width - textWidth) / 2, baseLine, mPaint);
}
/**
* 繪制默認(rèn)狀態(tài)的按鈕
*
* @param mCanvas
* @param mPaint
*/
private void onDrawDefault(Canvas mCanvas, Paint mPaint) {
drawRound(mCanvas, mPaint, Paint.Style.STROKE, 0);
//繪制居中文字
drawText(mCanvas, mPaint, button.getTextSize(), button.getColorBase());
}
/**
* 繪制按下?tīng)顟B(tài)的按鈕
*
* @param mCanvas
* @param mPaint
*/
private void onDrawTouch(Canvas mCanvas, Paint mPaint) {
drawRound(mCanvas, mPaint, Paint.Style.FILL, button.getStroke());
//繪制文字,字體要變化
drawText(mCanvas, mPaint, button.getTextSizeTouch(), Color.WHITE);
}
/**
* 繪制抬起狀態(tài)的按鈕
*
* @param mCanvas
* @param mPaint
*/
private void onDrawUp(Canvas mCanvas, Paint mPaint) {
drawRound(mCanvas, mPaint, Paint.Style.FILL, 0);
drawText(mCanvas, mPaint, button.getTextSize(), Color.WHITE);
}
/**
* 繪制進(jìn)入下一狀態(tài)的按鈕
*
* @param mCanvas
* @param mPaint
*/
private void onDrawNext(Canvas mCanvas, Paint mPaint) {
mPaint.setColor(button.getColorBase());
mPaint.setStyle(Paint.Style.FILL);
//繪制邊框
if (width >= height) {
mCanvas.drawRoundRect(new RectF(centerX - width / 2, centerY - height / 2, centerX + width / 2, centerY + height / 2),
button.getRound(), button.getRound(), mPaint);
//繪制文字
mPaint.setColor(Color.WHITE);
mPaint.setStrokeWidth(button.getStrokeText());
mPaint.setTextSize(button.getTextSize());
Paint.FontMetrics metrics = mPaint.getFontMetrics();
int textWidth = (int) mPaint.measureText(button.getText());
int baseLine = (int) (centerY + (metrics.bottom - metrics.top) / 2 - metrics.bottom);
mCanvas.drawText(button.getText(), centerX - textWidth / 2, baseLine, mPaint);
} else {
mCanvas.drawOval(new RectF(centerX - width / 2, centerY - height / 2, centerX + width / 2, centerY + height / 2), mPaint);
}
}
}
然后是第二個(gè)狀態(tài),進(jìn)度條狀態(tài):
/**
* Created by ccwxf on 2016/2/29.
*/
public class ProgressStatus implements ButtonStatus {
//轉(zhuǎn)圈的子狀態(tài)
private static final int Status_Once = 0;
private static final int Status_Twice = 1;
//轉(zhuǎn)圈的漸變量
private static final int Delay_Progress = 10;
private static final int Angle_Progress = 5;
private static final int Angle_Default = -90;
private static final int Andle_Full = 270;
private AnimationButton button;
private int width;
private int height;
private int centerX;
private int centerY;
private int radius;
private int status = Status_Once;
//當(dāng)前的進(jìn)度
private float progress = Angle_Default;
private Handler handler = new Handler();
public ProgressStatus(AnimationButton button, int width, int height, int centerX, int centerY) {
this.button = button;
this.width = width;
this.height = height;
this.centerX = centerX;
this.centerY = centerY;
//繪制起點(diǎn)是Stroke的中點(diǎn),若不減去這個(gè)值,則onDraw時(shí),會(huì)不完整。
this.radius = (width - button.getStrokeProgress()) / 2;
startProgress();
}
/**
* 開(kāi)始遞歸轉(zhuǎn)動(dòng)進(jìn)度條
*/
private void startProgress() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
if(progress >= Andle_Full){
//如果是手動(dòng)結(jié)束模式
if(button.getMode() == AnimationButton.Mode.Hand_Finish && button.isProgressStop()){
//改變狀態(tài)
button.changeStatus(Status.Finish, width, height, centerX, centerY);
return;
}else{
if(status == Status_Once){
status = Status_Twice;
}else if(status == Status_Twice){
//如果是自動(dòng)結(jié)束模式,則在第二次進(jìn)度結(jié)束時(shí)改變狀態(tài)
if(button.getMode() == AnimationButton.Mode.Auto_Finish){
//改變狀態(tài)
button.changeStatus(Status.Finish, width, height, centerX, centerY);
return;
}else{
status = Status_Once;
}
}
//重置進(jìn)度
progress = Angle_Default;
}
}
progress += Angle_Progress;
button.invalidate();
handler.postDelayed(this, Delay_Progress);
}
}, Delay_Progress);
}
@Override
public Status getStatus() {
return Status.Progress;
}
@Override
public boolean onTouchEvent(MotionEvent mEvent) {
return false;
}
@Override
public void onDraw(Canvas mCanvas, Paint mPaint) {
if(status == Status_Once){
//繪制灰色背景
onDrawCircle(mCanvas, mPaint, button.getColorBack());
//繪制綠色進(jìn)度
onDrawArc(mCanvas, mPaint, button.getColorBase(), Angle_Default, progress);
}else if(status == Status_Twice){
//繪制綠色背景
onDrawCircle(mCanvas, mPaint, button.getColorBase());
//繪制灰色進(jìn)度
onDrawArc(mCanvas, mPaint, button.getColorBack(), Angle_Default, progress);
}
}
/**
* 畫(huà)一整個(gè)圓作為背景
* @param mCanvas 畫(huà)布
* @param mPaint 畫(huà)筆
* @param color 顏色
*/
private void onDrawCircle(Canvas mCanvas, Paint mPaint, int color){
mPaint.setColor(color);
mPaint.setStrokeWidth(button.getStrokeProgress());
mPaint.setStyle(Paint.Style.STROKE);
mCanvas.drawCircle(centerX, centerY, radius, mPaint);
}
/**
* 畫(huà)一端圓弧
* @param mCanvas 畫(huà)布
* @param mPaint 畫(huà)筆
* @param color 顏色
* @param start 開(kāi)始角度
* @param stop 結(jié)束角度
*/
private void onDrawArc(Canvas mCanvas, Paint mPaint, int color, float start, float stop){
mPaint.setColor(color);
mPaint.setStrokeWidth(button.getStrokeProgress());
mPaint.setStyle(Paint.Style.STROKE);
//第三個(gè)參數(shù)是掃過(guò)的角度,起點(diǎn)0默認(rèn)為右邊
mCanvas.drawArc(new RectF(centerX - radius, centerY - radius, centerX + radius, centerY + radius),
start, stop - start, false, mPaint);
}
}
最后一個(gè)狀態(tài):
/**
* Created by ccwxf on 2016/2/29.
*/
public class FinishStatus implements ButtonStatus {
private static final int Status_Stretch = 0;
private static final int Status_Finish = 1;
private static final int Stroke_Over = 10;
private static final String Text_Over = "√";
private static final int Text_Over_Size = 40;
private static final int Delay_Stretch = 10;
private static final int Pixel_Stretch = 8;
private AnimationButton button;
private int width;
private int height;
private int centerX;
private int centerY;
private int status = Status_Stretch;
private Handler handler = new Handler();
public FinishStatus(AnimationButton button, int width, int height, int centerX, int centerY) {
this.button = button;
this.width = width;
this.height = height;
this.centerX = centerX;
this.centerY = centerY;
startStretch();
}
/**
* 開(kāi)始伸展背景
*/
private void startStretch() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
if(width < button.getMaxWidth()){
width += Pixel_Stretch;
button.invalidate();
handler.postDelayed(this, Delay_Stretch);
}else{
width = button.getMaxWidth();
if(status == Status_Stretch){
status = Status_Finish;
}
button.invalidate();
}
}
}, Delay_Stretch);
}
@Override
public Status getStatus() {
return Status.Finish;
}
@Override
public boolean onTouchEvent(MotionEvent mEvent) {
return false;
}
@Override
public void onDraw(Canvas mCanvas, Paint mPaint) {
//繪制背景
mPaint.setColor(button.getColorBase());
mPaint.setStyle(Paint.Style.FILL);
mCanvas.drawRoundRect(new RectF(centerX - width / 2, centerY - height / 2, centerX + width / 2, centerY + height / 2 ),
button.getRound(), button.getRound(), mPaint);
//繪制圖片
if(status == Status_Finish){
mPaint.setColor(Color.WHITE);
mPaint.setStrokeWidth(Stroke_Over);
mPaint.setTextSize(Text_Over_Size);
Paint.FontMetrics metrics = mPaint.getFontMetrics();
int textWidth = (int) mPaint.measureText(Text_Over);
int baseLine = (int) (height / 2 + (metrics.bottom - metrics.top) / 2 - metrics.bottom);
mCanvas.drawText(Text_Over, (width - textWidth) / 2, baseLine, mPaint);
}
}
}
好了上面就是所有的源碼了。雖然被我概括成三個(gè)大狀態(tài),但是如果分細(xì)一點(diǎn)的話,大概需要9個(gè)狀態(tài)。在各個(gè)大狀態(tài)代碼里面的子狀態(tài)就是這個(gè)了。
怎么使用呢,也非常簡(jiǎn)單,因?yàn)榇蟛糠值膮?shù)都有內(nèi)設(shè)值了。
/**
* Created by ccwxf on 2016/2/29.
*/
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final AnimationButton button = (AnimationButton) findViewById(R.id.button);
// button.setTextSizeTouch(25); //設(shè)置按下時(shí)字體的大小,不設(shè)置有默認(rèn)值
// button.setStrokeProgress(10); //設(shè)置進(jìn)度條的厚度,不設(shè)置有默認(rèn)值
// button.setColorBase(Color.GREEN); //設(shè)置整體基色,不設(shè)置有默認(rèn)值
// button.setColorBack(Color.GRAY); //設(shè)置進(jìn)度條的背景色,不設(shè)置有默認(rèn)值
// button.setStroke(3); //設(shè)置邊框的厚度,不設(shè)置有默認(rèn)值
// button.setStrokeText(0); //設(shè)置文本的厚度,不設(shè)置有默認(rèn)值
// button.setTextSize(30); //設(shè)置文本的字體大小,不設(shè)置有默認(rèn)值
// button.setRound(30); //設(shè)置圓角,不設(shè)置有默認(rèn)值
button.setText("登錄"); //設(shè)置文本,不設(shè)置有默認(rèn)值
button.setMode(AnimationButton.Mode.Hand_Finish); //設(shè)置進(jìn)度條模式,不設(shè)置有默認(rèn)值Mode.Auto_Finish
button.setOnAnimationButtonClickListener(new AnimationButton.OnAnimationButtonClickListener() {
@Override
public void onClick() {
//stopProgress方法 僅僅在button.setMode(AnimationButton.Mode.Hand_Finish);之后才有效。
button.stopProgress();
}
});
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)H5與Native交互的兩種方式
Android實(shí)現(xiàn)H5頁(yè)面和Native頁(yè)面交互的方法有兩種,一種是Url攔截的方法,另一種是JavaScript注入,下面來(lái)通過(guò)這篇文章分別講解。有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-12-12
Android TextView中文字通過(guò)SpannableString設(shè)置屬性用法示例
這篇文章主要介紹了Android TextView中文字通過(guò)SpannableString設(shè)置屬性用法,結(jié)合實(shí)例形式分析了TextView控件中SpannableString類相關(guān)屬性的使用技巧,需要的朋友可以參考下2016-08-08
Android通過(guò)AIDL在兩個(gè)APP之間Service通信
這篇文章主要為大家詳細(xì)介紹了Android通過(guò)AIDL在兩個(gè)APP之間Service通信,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Android4.4下MediaProvider無(wú)法向外置SD卡中文件寫(xiě)數(shù)據(jù)的解決方法
這篇文章主要介紹了Android4.4下MediaProvider無(wú)法向外置SD卡中文件寫(xiě)數(shù)據(jù)的解決方法,實(shí)例分析了Android4.4下針對(duì)讀寫(xiě)限制的修改技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android如何使用GestureDetector進(jìn)行手勢(shì)檢測(cè)詳解
GestureDetector使用很方便,提供了單擊,雙擊,長(zhǎng)按等操作的處理,但是一般的定義界面都比較復(fù)雜,還用很多需要注意的地方,這篇文章主要給大家介紹了關(guān)于Android如何使用GestureDetector進(jìn)行手勢(shì)檢測(cè)的相關(guān)資料,需要的朋友可以參考下2022-01-01

