自定义状态切换按钮

简介: 最近在做一个项目,一个界面的按钮UI给画成了这样(默认状态是蓝色的然后触摸后变成灰色的)UI效果然后本着给低版本系统APP适配的职业素养(其实是不想画这种按钮),想让UI兄弟给将图标改成整个按钮效果的图片,可是。

最近在做一个项目,一个界面的按钮UI给画成了这样(默认状态是蓝色的然后触摸后变成灰色的)

img_d8ed28f1de28115fa5c69fca763ab67c.png
UI效果

然后本着给低版本系统APP适配的职业素养(其实是不想画这种按钮),想让UI兄弟给将图标改成整个按钮效果的图片,可是。。。人说人也很忙不给俺做咋办。。。。没办法只好自己写了一个满足这种需求的按钮了。。。

img_f3e899cfe0b503a824f614d56d44e7e4.png
职业素养

整体流程如下

img_0221ab4ee1dd24cca133870a64aaca51.png
实现流程

下面说一下主要功能的实现代码

○动态的修改控件大小,这里没什么难处,主要是动态修改控件大小的代码要放在onLayout方法里,之前试了onMeasure方法里设置然并卵。

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    int width = getWidth();
    LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) imageView.getLayoutParams();
    layoutParams.width= (int) (width*0.5);
    layoutParams.height=(int) (width*0.5);
    layoutParams.topMargin=(int) (width*0.05);
    textView.setTextSize((float) (width*0.09));
}

○重写onTouchEvent,实现点击效果,这里是通过判断按下、抬起来动态的设置显示效果

 @Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()){
        case MotionEvent.ACTION_DOWN:;
            if(pressImage!=0){
                imageView.setImageResource(pressImage);
            }
            break;
        case MotionEvent.ACTION_UP:
            textView.setTextColor(textcolorDefault);
            if(defaultImage!=0){
                imageView.setImageResource(defaultImage);
            }
            break;
    }
    return true;
}

○添加点击事件,这里选择在抬起的时候执行点击事件

//点击事件接口
public interface MyStateButtonClickListener {
    void onClick(View view);
}
 @Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()){
        case MotionEvent.ACTION_DOWN:;
            textView.setTextColor(textcolorPress);
            if(pressImage!=0){
                imageView.setImageResource(pressImage);
            }
            break;
        case MotionEvent.ACTION_UP:
            textView.setTextColor(textcolorDefault);
            if(defaultImage!=0){
                imageView.setImageResource(defaultImage);
            }
            //抬起时执行点击事件
            if(myStateButtonClickListener!=null){
                myStateButtonClickListener.onClick(view);
            }
            break;
    }
    return true;
}

○通过代码添加边框,并添加自定义属性(默认图片、点击图片、默认文字颜色、点击文字颜色、边框宽度、边框圆角大小、默认边框颜色、点击边框颜色)

○attrs文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyStateButton">
    <attr name="defaultImage" format="reference"/>
    <attr name="pressImage" format="reference"/>
    <attr name="text" format="string"/>
    <attr name="defaultTextColor" format="color"/>
    <attr name="pressTextColor" format="color"/>
    <attr name="defaultBorderColor" format="color"/>
    <attr name="pressBorderColor" format="color"/>
    <attr name="cornerRadius" format="float"/>
    <attr name="borderWidth" format="integer"/>
</declare-styleable>
</resources>

○获取属性值

//        初始化GradientDrawable用于显示边框
    defaultDrawable = new GradientDrawable();
    pressDrawable = new GradientDrawable();
    TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyStateButton);
    if(typedArray!=null){
//            默认图片
        defaultImage = typedArray.getResourceId(R.styleable.MyStateButton_defaultImage, R.mipmap.one);
//            点击图片
        pressImage = typedArray.getResourceId(R.styleable.MyStateButton_pressImage, R.mipmap.one_press);
//            设置文字
        String text = typedArray.getString(R.styleable.MyStateButton_text);
//            默认文字颜色
        textcolorDefault = typedArray.getColor(R.styleable.MyStateButton_defaultTextColor, Color.parseColor("#567DBF"));
//            点击文字颜色
        textcolorPress = typedArray.getColor(R.styleable.MyStateButton_pressTextColor, Color.parseColor("#BFBFBF"));
        imageView.setImageResource(defaultImage);
        textView.setTextColor(textcolorDefault);
        textView.setText(text);
//            默认边框颜色
        borderColorDefault = typedArray.getColor(R.styleable.MyStateButton_defaultBorderColor, Color.parseColor("#567DBF"));
//            点击边框颜色
        borderColorPress = typedArray.getColor(R.styleable.MyStateButton_pressBorderColor, Color.parseColor("#BFBFBF"));
//            边框宽度
        borderWidth = typedArray.getInteger(R.styleable.MyStateButton_borderWidth, 2);
//            边框圆角大小
        cornerRadius = typedArray.getFloat(R.styleable.MyStateButton_cornerRadius, 8);
        defaultDrawable.setStroke(borderWidth,borderColorDefault);
        pressDrawable.setStroke(borderWidth,borderColorPress);
        defaultDrawable.setCornerRadius(cornerRadius);
        pressDrawable.setCornerRadius(cornerRadius);
        setBackground(defaultDrawable);
    }

最终效果

img_3cc2bf4e548cfe32bf41795c224c3292.gif
最终效果

附上源码地址https://github.com/myml666/MyStateButton

个人博客https://myml666.github.io

目录
相关文章
输入框禁用状态 可清空输入框如何实现?组件写的
输入框禁用状态 可清空输入框如何实现?组件写的
|
小程序 前端开发 JavaScript
微信小程序分类菜单激活状态跟随列表滚动自动切换
微信小程序分类菜单激活状态跟随列表滚动自动切换
164 0
微信小程序分类菜单激活状态跟随列表滚动自动切换
|
前端开发
添加按钮的两种方式
添加按钮的两种方式
86 0
|
JavaScript
fastadmin 自定义 按钮 动态切换数据 TAB切换
fastadmin 自定义 按钮 动态切换数据 TAB切换
274 0
|
JSON 小程序 JavaScript
小程序卡片切换效果组件wxCardSwiper
小程序卡片切换效果组件wxCardSwiper
528 0
|
JavaScript 开发者
组件切换-使用 v-if 和 v-else 结合 flag 进行切换|学习笔记
快速学习组件切换-使用 v-if 和 v-else 结合 flag 进行切换
158 0
|
Android开发
Android软键盘状态的切换及其强制隐藏
MainActivity如下:package cc.c; import android.os.Bundle; import android.view.
850 0
|
存储
PyQt5 技巧篇-复选框绑定行内容,全选、清空、展示选中的内容功能实现演示,设置复选框选中,检查复选框选中状态
PyQt5 技巧篇-复选框绑定行内容,全选、清空、展示选中的内容功能实现演示,设置复选框选中,检查复选框选中状态
472 0
PyQt5 技巧篇-复选框绑定行内容,全选、清空、展示选中的内容功能实现演示,设置复选框选中,检查复选框选中状态