您现在的位置是:首页 > 文章详情

Android--代码实现自定义Button

日期:2018-05-16点击:333
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/80350654

使用StateButton.java,res/values/attrs.xml

import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.graphics.drawable.StateListDrawable; import android.support.annotation.ColorInt; import android.support.annotation.FloatRange; import android.support.annotation.IntRange; import android.support.v7.widget.AppCompatButton; import android.util.AttributeSet; import com.xiaobai.cloneapp.R; /** * 自定义button */ public class StateButton extends AppCompatButton{ //text color private int mNormalTextColor = 0; private int mPressedTextColor = 0; private int mUnableTextColor = 0; ColorStateList mTextColorStateList; //animation duration private int mDuration = 0; //radius private float mRadius = 0; private boolean mRound; //stroke private float mStrokeDashWidth = 0; private float mStrokeDashGap = 0; private int mNormalStrokeWidth = 0; private int mPressedStrokeWidth = 0; private int mUnableStrokeWidth = 0; private int mNormalStrokeColor = 0; private int mPressedStrokeColor = 0; private int mUnableStrokeColor = 0; //background color private int mNormalBackgroundColor = 0; private int mPressedBackgroundColor = 0; private int mUnableBackgroundColor = 0; private GradientDrawable mNormalBackground; private GradientDrawable mPressedBackground; private GradientDrawable mUnableBackground; private int[][] states; StateListDrawable mStateBackground; public StateButton(Context context) { this(context, null); } public StateButton(Context context, AttributeSet attrs) { this(context, attrs, android.support.v7.appcompat.R.attr.buttonStyle); } public StateButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setup(attrs); } private void setup(AttributeSet attrs) { states = new int[4][]; Drawable drawable = getBackground(); if(drawable != null && drawable instanceof StateListDrawable){ mStateBackground = (StateListDrawable) drawable; }else{ mStateBackground = new StateListDrawable(); } mNormalBackground = new GradientDrawable(); mPressedBackground = new GradientDrawable(); mUnableBackground = new GradientDrawable(); //pressed, focused, normal, unable states[0] = new int[] { android.R.attr.state_enabled, android.R.attr.state_pressed }; states[1] = new int[] { android.R.attr.state_enabled, android.R.attr.state_focused }; states[3] = new int[] { -android.R.attr.state_enabled}; states[2] = new int[] { android.R.attr.state_enabled }; TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.StateButton); //get original text color as default //set text color mTextColorStateList = getTextColors(); int mDefaultNormalTextColor = mTextColorStateList.getColorForState(states[2], getCurrentTextColor()); int mDefaultPressedTextColor = mTextColorStateList.getColorForState(states[0], getCurrentTextColor()); int mDefaultUnableTextColor = mTextColorStateList.getColorForState(states[3], getCurrentTextColor()); mNormalTextColor = a.getColor(R.styleable.StateButton_normalTextColor, mDefaultNormalTextColor); mPressedTextColor = a.getColor(R.styleable.StateButton_pressedTextColor, mDefaultPressedTextColor); mUnableTextColor = a.getColor(R.styleable.StateButton_unableTextColor, mDefaultUnableTextColor); setTextColor(); //set animation duration mDuration = a.getInteger(R.styleable.StateButton_animationDuration, mDuration); mStateBackground.setEnterFadeDuration(mDuration); mStateBackground.setExitFadeDuration(mDuration); //set background color mNormalBackgroundColor = a.getColor(R.styleable.StateButton_normalBackgroundColor, 0); mPressedBackgroundColor = a.getColor(R.styleable.StateButton_pressedBackgroundColor, 0); mUnableBackgroundColor = a.getColor(R.styleable.StateButton_unableBackgroundColor, 0); mNormalBackground.setColor(mNormalBackgroundColor); mPressedBackground.setColor(mPressedBackgroundColor); mUnableBackground.setColor(mUnableBackgroundColor); //set radius mRadius = a.getDimensionPixelSize(R.styleable.StateButton_radius, 0); mRound = a.getBoolean(R.styleable.StateButton_round, false); mNormalBackground.setCornerRadius(mRadius); mPressedBackground.setCornerRadius(mRadius); mUnableBackground.setCornerRadius(mRadius); //set stroke mStrokeDashWidth = a.getDimensionPixelSize(R.styleable.StateButton_strokeDashWidth, 0); mStrokeDashGap = a.getDimensionPixelSize(R.styleable.StateButton_strokeDashWidth, 0); mNormalStrokeWidth = a.getDimensionPixelSize(R.styleable.StateButton_normalStrokeWidth, 0); mPressedStrokeWidth = a.getDimensionPixelSize(R.styleable.StateButton_pressedStrokeWidth, 0); mUnableStrokeWidth = a.getDimensionPixelSize(R.styleable.StateButton_unableStrokeWidth, 0); mNormalStrokeColor = a.getColor(R.styleable.StateButton_normalStrokeColor, 0); mPressedStrokeColor = a.getColor(R.styleable.StateButton_pressedStrokeColor, 0); mUnableStrokeColor = a.getColor(R.styleable.StateButton_unableStrokeColor, 0); setStroke(); //set background mStateBackground.addState(states[0], mPressedBackground); mStateBackground.addState(states[1], mPressedBackground); mStateBackground.addState(states[3], mUnableBackground); mStateBackground.addState(states[2], mNormalBackground); setBackgroundDrawable(mStateBackground); a.recycle(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); setRound(mRound); } /****************** stroke color *********************/ public void setNormalStrokeColor(@ColorInt int normalStrokeColor) { this.mNormalStrokeColor = normalStrokeColor; setStroke(mNormalBackground, mNormalStrokeColor, mNormalStrokeWidth); } public void setPressedStrokeColor(@ColorInt int pressedStrokeColor) { this.mPressedStrokeColor = pressedStrokeColor; setStroke(mPressedBackground, mPressedStrokeColor, mPressedStrokeWidth); } public void setUnableStrokeColor(@ColorInt int unableStrokeColor) { this.mUnableStrokeColor = unableStrokeColor; setStroke(mUnableBackground, mUnableStrokeColor, mUnableStrokeWidth); } public void setStateStrokeColor(@ColorInt int normal, @ColorInt int pressed, @ColorInt int unable){ mNormalStrokeColor = normal; mPressedStrokeColor = pressed; mUnableStrokeColor = unable; setStroke(); } /****************** stroke width *********************/ public void setNormalStrokeWidth(int normalStrokeWidth) { this.mNormalStrokeWidth = normalStrokeWidth; setStroke(mNormalBackground, mNormalStrokeColor, mNormalStrokeWidth); } public void setPressedStrokeWidth(int pressedStrokeWidth) { this.mPressedStrokeWidth = pressedStrokeWidth; setStroke(mPressedBackground, mPressedStrokeColor, mPressedStrokeWidth); } public void setUnableStrokeWidth(int unableStrokeWidth) { this.mUnableStrokeWidth = unableStrokeWidth; setStroke(mUnableBackground, mUnableStrokeColor, mUnableStrokeWidth); } public void setStateStrokeWidth(int normal, int pressed, int unable){ mNormalStrokeWidth = normal; mPressedStrokeWidth = pressed; mUnableStrokeWidth= unable; setStroke(); } public void setStrokeDash(float strokeDashWidth, float strokeDashGap) { this.mStrokeDashWidth = strokeDashWidth; this.mStrokeDashGap = strokeDashWidth; setStroke(); } private void setStroke(){ setStroke(mNormalBackground, mNormalStrokeColor, mNormalStrokeWidth); setStroke(mPressedBackground, mPressedStrokeColor, mPressedStrokeWidth); setStroke(mUnableBackground, mUnableStrokeColor, mUnableStrokeWidth); } private void setStroke(GradientDrawable mBackground, int mStrokeColor, int mStrokeWidth) { mBackground.setStroke(mStrokeWidth, mStrokeColor, mStrokeDashWidth, mStrokeDashGap); } /******************** radius *******************************/ public void setRadius(@FloatRange(from = 0) float radius) { this.mRadius = radius; mNormalBackground.setCornerRadius(mRadius); mPressedBackground.setCornerRadius(mRadius); mUnableBackground.setCornerRadius(mRadius); } public void setRound(boolean round){ this.mRound = round; int height = getMeasuredHeight(); if(mRound){ setRadius(height / 2f); } } public void setRadius(float[] radii){ mNormalBackground.setCornerRadii(radii); mPressedBackground.setCornerRadii(radii); mUnableBackground.setCornerRadii(radii); } /******************** background color **********************/ public void setStateBackgroundColor(@ColorInt int normal, @ColorInt int pressed, @ColorInt int unable){ mNormalBackgroundColor = normal; mPressedBackgroundColor = pressed; mUnableBackgroundColor = unable; mNormalBackground.setColor(mNormalBackgroundColor); mPressedBackground.setColor(mPressedBackgroundColor); mUnableBackground.setColor(mUnableBackgroundColor); } public void setNormalBackgroundColor(@ColorInt int normalBackgroundColor) { this.mNormalBackgroundColor = normalBackgroundColor; mNormalBackground.setColor(mNormalBackgroundColor); } public void setPressedBackgroundColor(@ColorInt int pressedBackgroundColor) { this.mPressedBackgroundColor = pressedBackgroundColor; mPressedBackground.setColor(mPressedBackgroundColor); } public void setUnableBackgroundColor(@ColorInt int unableBackgroundColor) { this.mUnableBackgroundColor = unableBackgroundColor; mUnableBackground.setColor(mUnableBackgroundColor); } /*******************alpha animation duration********************/ public void setAnimationDuration(@IntRange(from = 0)int duration){ this.mDuration = duration; mStateBackground.setEnterFadeDuration(mDuration); } /*************** text color ***********************/ private void setTextColor() { int[] colors = new int[] {mPressedTextColor, mPressedTextColor, mNormalTextColor, mUnableTextColor}; mTextColorStateList = new ColorStateList(states, colors); setTextColor(mTextColorStateList); } public void setStateTextColor(@ColorInt int normal, @ColorInt int pressed, @ColorInt int unable){ this.mNormalTextColor = normal; this.mPressedTextColor = pressed; this.mUnableTextColor = unable; setTextColor(); } public void setNormalTextColor(@ColorInt int normalTextColor) { this.mNormalTextColor = normalTextColor; setTextColor(); } public void setPressedTextColor(@ColorInt int pressedTextColor) { this.mPressedTextColor = pressedTextColor; setTextColor(); } public void setUnableTextColor(@ColorInt int unableTextColor) { this.mUnableTextColor = unableTextColor; setTextColor(); } } 
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="StateButton"> <!--text color--> <attr name="normalTextColor" format="color|reference"/> <attr name="pressedTextColor" format="color|reference"/> <attr name="unableTextColor" format="color|reference"/> <!--stroke width and color, dash width, dash gap--> <attr name="strokeDashWidth" format="dimension|reference"/> <attr name="strokeDashGap" format="dimension|reference"/> <attr name="normalStrokeWidth" format="dimension|reference"/> <attr name="pressedStrokeWidth" format="dimension|reference"/> <attr name="unableStrokeWidth" format="dimension|reference"/> <attr name="normalStrokeColor" format="color|reference"/> <attr name="pressedStrokeColor" format="color|reference"/> <attr name="unableStrokeColor" format="color|reference"/> <!--background color--> <attr name="normalBackgroundColor" format="color|reference"/> <attr name="pressedBackgroundColor" format="color|reference"/> <attr name="unableBackgroundColor" format="color|reference"/> <!--background radius--> <attr name="radius" format="dimension|reference"/> <attr name="round" format="boolean|reference"/> <!--animation duration--> <attr name="animationDuration" format="integer|reference"/> </declare-styleable> <declare-styleable name="StateImageView"> <attr name="normalBackground" format="color|reference"/> <attr name="pressedBackground" format="color|reference"/> <attr name="unableBackground" format="color|reference"/> <!--animation duration--> <attr name="AnimationDuration" format="integer|reference"/> </declare-styleable> </resources> 
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/dp_20" android:layout_marginTop="@dimen/dp_10" android:layout_marginBottom="@dimen/dp_5" android:src="@drawable/app" /> <TextView android:id="@+id/text_imei" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="@dimen/dp_20" android:layout_marginTop="@dimen/dp_10" android:layout_marginBottom="@dimen/dp_5" android:textSize="20sp" android:text="123"/> <!-- 在根目录写入:xmlns:app="http://schemas.android.com/apk/res-auto" --> <deadline.statebutton.StateButton android:id="@+id/stateButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="StateButton" app:radius="5dp" app:round="true" app:animationDuration="200" app:strokeDashGap="2dp" app:strokeDashWidth="5dp" app:normalStrokeWidth="2dp" app:pressedStrokeWidth="2dp" app:unableStrokeWidth="2dp" app:normalStrokeColor="@android:color/white" app:pressedStrokeColor="@android:color/white" app:unableStrokeColor="@android:color/white" app:normalTextColor="@android:color/white" app:pressedTextColor="@android:color/white" app:unableTextColor="@android:color/white" app:normalBackgroundColor="@color/colorPrimaryDark" app:pressedBackgroundColor="@color/colorPrimaryDark" app:unableBackgroundColor="@color/colorPrimaryDark"/> </LinearLayout> 


Attribute default value xml java
normalTextColor original text color normalTextColor setNormalTextColor(int color)
pressedTextColor original text color pressedTextColor setPressedTextColor(int color)
unableTextColor original text color unableTextColor setUnableTextColor(int color)
strokeDashWidth 0 strokeDashWidth setStrokeDash(int dashWidth, int dashGap)
strokeDashGap 0 strokeDashGap setStrokeDash(int dashWidth, int dashGap)
normalStrokeWidth 0 normalStrokeWidth setNormalStrokeWidth(int widht)
pressedStrokeWidth 0 pressedStrokeWidth setPressedStrokeWidth(int widht)
unableStrokeWidth 0 unableStrokeWidth setUnableStrokeWidth(int widht)
normalStrokeColor 0 normalStrokeColor setNormalStrokeColor(int color)
pressedStrokeColor 0 pressedStrokeColor setPressedStrokeColor(int color)
unableStrokeColor 0 unableStrokeColor setUnableStrokeColor(int color)
normalBackgroundColor 0 normalBackgroundColor setNormalBackgroundColor(int color)
pressedBackgroundColor 0 pressedBackgroundColor setPressedBackgroundColor(int color)
unableBackgroundColor 0 unableBackgroundColor setUnableBackgroundColor(int color)
radius 0 radius setRadius(int radius) / setRadius(float[] radii)
round false round setRound(boolean round)
animationDuration 0ms animationDuration setAnimationDuration(int duration)
也可以使用框架实现: ButtonStyle


原文链接:https://yq.aliyun.com/articles/631441
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章