Loading...
墨滴

帅次

2021/10/27  阅读:27  主题:自定义主题1

Android Touch事件分发(源码分析)

开局一张图

本文旨在介绍Button和他的子类。

Button

Button 用户可以点击或长按等操作的用户界面元素,具有正常状态和点击状态,Button 继承自 TextView ,所以可以 TextView 的那些属性。

实际开发中,无非是对按钮的几个状态做相应的操作,比如:按钮按下的时候 用一种颜色,弹起又一种颜色,或者按钮不可用的时候一种颜色这样。先看看效果图

从上面图可以看出有1个基础版Button,2个进阶版Button。

基础版Button

在布局文件中添加一个Button

 <Button
        android:id="@+id/btn_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="基本Button" />

不仅样式丑陋而且文字显示为大写BUTTON。

进阶版Button

在基础版Button上新增一些xml属性。

1.在res/drawable目录下新建文件 bg_btn_frame_gradient.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!--radius四个圆角统一设置,也可以单独对某一个圆角设置。例:topLeftRadius-->
    <corners android:radius="8dp"/>
    <!--边框宽度width、颜色color-->
    <stroke android:width="1dp" android:color="@color/color_ff0000" />
    <gradient
        android:startColor="@color/color_188FFF"
        android:centerColor="@color/color_FF773D"
        android:endColor="@color/color_ff0000"
        android:type="linear"
        />

</shape>

2.在res/drawable目录下新建文件 bg_btn_selector_bg.xml

<?xml version ="1.0" encoding ="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!--简单版仅颜色,直接设置android:radius="8dp"无效-->
    <!--未点击显示颜色-->
    <item android:drawable="@color/color_FF773D" android:state_pressed="false" />
    <!--点击显示颜色-->
    <item android:drawable="@color/color_188FFF" android:state_pressed="true" />

    <!--复杂版带圆角-->
    <!--未点击显示颜色-->
    <item android:state_pressed="false">
        <shape>
            <solid  android:color="@color/color_FF773D" />
            <corners android:radius="8dp" />
        </shape>
    </item>
    <!--点击显示颜色-->
    <item android:state_pressed="true">
        <shape>
            <solid  android:color="@color/color_188FFF" />
            <corners android:radius="8dp" />
        </shape>
    </item>
</selector>

3.修改布局文件添加两个Button

<Button
        android:id="@+id/btn_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/dimen_20"
        android:background="@drawable/bg_btn_frame_gradient"
        android:padding="@dimen/dimen_10"
        android:text="背景色渐变的Button"
        android:textAllCaps="false"
        android:textColor="@color/white"
        android:textSize="@dimen/text_size_18" />


    <Button
        android:id="@+id/btn_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/dimen_20"
        android:background="@drawable/bg_btn_selector_bg"
        android:onClick="btn3OnClick"
        android:padding="@dimen/dimen_10"
        android:textAllCaps="false"
        android:text="带按下效果的Button"
        android:textColor="@color/white"
        android:textSize="@dimen/text_size_18" />

xml小结

此时已经完成了上面的效果图。 我们将 Button 的 android:background 属性设置为该 drawable 资源即可轻松实现按下 按钮时不同的按钮颜色或背景

  • btn_2因为直接使用drawable,并且未使用selector。所以无点击效果。不管点击还是未点击始终显示渐变色

StateListDrawable 是 Drawable 资源的一种,可以根据不同的状态,设置不同的图片效果,关键节点 < selector >

  • btn_3使用了selector,对item标签下android:state_pressed进行不同状态的设置背景色和圆角。根据控件是否被按下展示(color_FF773D/color_188FFF)

交互事件

Button的核心还是在于和用户的交互,否则使用TextView即可。

1.Activity 实现 View.OnClickListener方法

public class ButtonActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn_1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.view_button);//加载布局文件
        initViewButton();
    }
    private void initViewButton(){
        btn_1 = findViewById(R.id.btn_1);
        btn_1.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_1:
                Toast.makeText(this,"btn_1点击事件",Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
    }
}

2.在布局文件中声明

  • 给button添加 android:onClick="btn3OnClick"属性
  • 在activity中添加对应名称的方法,满足以下条件
    • 方法的修饰符是 public;
    • 返回值是 void 类型;
    //不需要关联控件
    public void btn3OnClick(View view){
        Toast.makeText(this,"btn_3点击事件",Toast.LENGTH_SHORT).show();
    }

匿名内部类实现

附送一个长按匿名内部类,需要注意的是onLongClick返回false会继续执行onClick事件,如果返回true,则不执行onClick事件。

btn_2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(ButtonActivity.this,"btn_2点击事件",Toast.LENGTH_SHORT).show();
            }
        });
        btn_2.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                Toast.makeText(ButtonActivity.this,"btn_2长按点击事件",Toast.LENGTH_SHORT).show();
                return false;
            }
        });

内部类实现

//使用
    btn_1.setOnClickListener(new MyOnClickListener());
    //内部类实现OnClickListener接口
    class MyOnClickListener implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            Toast.makeText(ButtonActivity.this,"btn_1点击事件MyOnClickListener",Toast.LENGTH_SHORT).show();
        }
    }

Button的setOnClickListener优先级比xml中android:onClick高,如果同时设置点击事件,只有setOnClickListener有效。 TextView也可以实现onClick事件,如果部分Button使用麻烦可以考虑使用TextView来代替。 ———————————————— 版权声明:本文为CSDN博主「帅次」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/g984160547/article/details/117778155 以上几种点击事件是实现方式基本满足各位的需求了,下面咱们看看Button的子类。

帅次

2021/10/27  阅读:27  主题:自定义主题1

作者介绍

帅次

公众号:帅次