安卓中自定义点击按钮,点击可以改变颜色

本文介绍如何在安卓应用中创建一个自定义按钮,该按钮能在被点击时改变颜色及渐变效果。通过定义一个状态选择器并在按钮背景中使用它来实现不同状态下的视觉效果。

安卓中自定义点击按钮,点击可以改变颜色

效果如下:

不点击的时候的状态为:

1)给一个Button设置一个圆角矩形的背景。
2)正常情况圆角矩形的边框是蓝色,填充颜色是灰色
3)当按钮被按下的时候圆角矩形的边框是红色的, 内部颜色是渐变颜色,渐变方向从右到左 红-->蓝


首先我们要定义一个选择器:

在res目录下新建一个drawable目录,在drawable目录下新建一个color_button的xml文件,类型为selector



color_button.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >

<shape android:shape="rectangle">
    <stroke android:width="5dp"
            android:color="#f00"/>
    <corners android:radius="20dp"/>

    <gradient android:startColor="#f00"
              android:angle="180"
              android:endColor="#00f"/>
</shape>

</item>
<item android:state_pressed="false" >
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
           android:shape="rectangle"
            >
        <stroke android:width="5dp"
                android:color="#ff5a27cc"/>
        <corners android:radius="20dp"/>
        <solid android:color="#ffcccccc"/>

    </shape>
</item>

</selector>

第二步把我们定义的选择器加载到button中去

</pre>在button中用设置button的效果为刚才定义的效果<span style="font-size:18px;"><span style="font-size:18px;"></span></span><pre name="code" class="plain"> android:background="@drawable/color_button"

</pre><pre name="code" class="plain"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"

        >

    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Hello World, MainActivity"
            />

    <Button
            android:padding="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我是一个按钮哦anannanan"
            android:background="@drawable/color_button"
            android:layout_gravity="center_horizontal"
       />
  
</LinearLayout>

最后我们直接运行到手机上就OK了,效果实现了。


### Android 自定义 Button 点击事件改变背景颜色动画效果 为了实现在点击按钮时从灰色变为渐变色的效果,可以创建一个自定义 `Button` 类并重写其绘制逻辑。通过监听触摸事件来触发颜色变化,并利用属性动画实现平滑过渡。 #### 创建自定义 View 组件 首先,在项目中新建一个继承于 `AppCompatButton` 的类: ```java public class GradientButton extends AppCompatButton { private boolean isPressed; private ValueAnimator colorAnim; public GradientButton(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { setOnClickListener(v -> animateColorChange()); } private void animateColorChange() { int startColor = Color.GRAY; int endColor = ContextCompat.getColor(getContext(), R.color.gradient_end); if (colorAnim != null && !colorAnim.isRunning()) { colorAnim.start(); } else { colorAnim = ValueAnimator.ofObject(new ArgbEvaluator(), startColor, endColor); colorAnim.setDuration(500); // 动画持续时间设为500毫秒 colorAnim.addUpdateListener(animation -> setBackgroundTintList(ColorStateList.valueOf((Integer) animation.getAnimatedValue()))); colorAnim.start(); } } } ``` 此代码片段展示了如何设置初始状态以及响应点击事件启动颜色变换动画[^1]。 #### 定义 XML 资源文件中的颜色资源 在项目的 res/values/colors.xml 文件内添加如下条目用于指定目标渐变色彩: ```xml <resources> <!-- 渐变结束的颜色 --> <color name="gradient_end">#FFD700</color> <!-- 黄金色为例 --> </resources> ``` #### 处理绘图与触控交互 根据接口设计模式分离关注点,可以在 `onTouchEvent()` 方法里捕获按下抬起动作,并调用相应的绘制函数更新界面显示[^3]: ```java @Override public boolean onTouchEvent(MotionEvent event){ switch(event.getAction()){ case MotionEvent.ACTION_DOWN: isPressed = true; invalidate(); // 请求重新绘制视图 break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: isPressed = false; invalidate(); break; } return super.onTouchEvent(event); } @Override protected void onDraw(Canvas canvas){ super.onDraw(canvas); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); if(isPressed){ // 当前处于按压状态下应用渐变着色器 LinearGradient shader = new LinearGradient( 0f, getHeight(), getWidth(), 0f, Color.GRAY, getResources().getColor(R.color.gradient_end), Shader.TileMode.CLAMP ); paint.setShader(shader); }else{ paint.setColor(Color.GRAY); } Rect bounds = getDrawingRect(); canvas.drawRect(bounds,paint); } ``` 上述代码实现了当检测到手指接触屏幕时更改按钮外观至带有线性梯度填充样式;而一旦释放则恢复默认灰阶表现形式[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值