Android 开发常用技巧

本文介绍了几种Android应用界面(UI)的优化方法,包括防止按钮快速点击、扩大按钮点击区域、给ImageView添加遮罩效果等,并提供了实现这些功能的具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、防止按钮快速点击的工具类:

private static final int MIN_DELAY_TIME= 1000;  // 两次点击间隔不能少于1000ms
    private static long lastClickTime;

    public static boolean isFastClick() {
        boolean flag = true;
        long currentClickTime = System.currentTimeMillis();
        if ((currentClickTime - lastClickTime) >= MIN_DELAY_TIME) {
            flag = false;
        }
        lastClickTime = currentClickTime;
        return flag;
    }

2、XML中添加点击事件

需要监听按钮的点击事件时,若按钮较多,可以在 xml 文件中添加android:onClick="add"属性,然后在 Activity 中添加对应的方法即可。,方法签名为:public void add(View view)

  <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:onClick="add"/>

3、创建用于管理所有活动的类:

public class ActivityCollector {

    public static List<Activity> activities = new ArrayList<>();

    public static void addActivity(Activity activity){
        activities.add(activity);
    }

    public static void removeActivity(Activity activity){
        activities.remove(activity);
    }

    public static void finishAllActivities(){
        for(Activity activity: activities){
            if (!activity.isFinishing()){
                activity.finish();
            }
        }
    }
}

创建BaseActivity 作为所有活动的父类:

public class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityCollector.addActivity(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}

4、扩大点击区域:

针对按钮的可点击区域较小的情况,可以使用控件的 paddingxxx属性替代部分 marginxxx 属性。margin属性指的控件之外的区域,padding则可以将这些区域归为自身所有,这样既可在不改变 UI 的情况下扩大点击区域。

5、给 ImageView 加遮罩(蒙层):

在 ImageView 外套一层 FrameLayout,设置 FrameLayout 的foreground属性。 

方法1.遮罩可直接叠加一层带alpha的纯白、或纯黑View,可直接在ImageView外套一层FrameLayout,其foreground(一般同学可能只知道background,其实framelayout还有foreground)给定一个selector(按下时给0x33000000,即泛黑),到位。

方法2.重写imageView,按下状态改变时invalidate(触发onDraw),onDraw中根据按下状态绘制0x33000000。注意imageView.setClickable(true),或imageView.setOnClickListener时才可触发dispatchSetPressed。

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);



// 取id

// imgTest = (ImageView) findViewById(R.id.imgTest);

loMain = (RelativeLayout) findViewById(R.id.loMain);



findViewById(R.id.btn1).setOnClickListener(this);

findViewById(R.id.btn2).setOnClickListener(this);



MyImg myImg = new MyImg(this);

myImg.setImageResource(R.drawable.meinv);

myImg.setClickable(true);

loMain.addView(myImg);

}



private class MyImg extends ImageView {



public MyImg(Context context) {

super(context);

}



@Override

protected void onDraw(Canvas canvas) {

// TODO Auto-generated method stub

super.onDraw(canvas);



if (isPressed())

canvas.drawColor(0x33000000);

}



@Override

protected void dispatchSetPressed(boolean pressed) {

// TODO Auto-generated method stub

super.dispatchSetPressed(pressed);

invalidate();

}

}

6、定义 Layout布局 时向上转为基类 View

在 activity 中定义 xml 中继承自 ViewGroup(如FrameLayout、LinearLayout、RelativeLayout等)的元素用 View 修饰,而非具体的xxxLayout,这样当 xml 布局修改时 activity 中相应的定义不用改变,如 FrameLayout:

   <FrameLayout
        android:id="@+id/layout_photo_album"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/img_bg_avatar"
        android:layout_toEndOf="@+id/img_avatar"
        android:layout_marginEnd="10dp">
   </FrameLayout>

定义如下:

View layoutPhotoAlbum;

layoutPhotoAlbum = findViewById(R.id.layout_photo_album);

7、同时居中和居右(或居左)对齐,使用FrameLayout替代RelativeLayout,性能更优

这里写图片描述 
类似上图的布局,使用如下FrameLayout布局:

    <FrameLayout
        android:id="@+id/ll_mine_risk_tips"
        android:layout_width="match_parent"
        android:layout_height="22dp"
        android:background="#fddfb5"
        android:visibility="gone"
        tools:visibility="visible">

        <TextView
            android:id="@+id/tv_mine_risk_tips"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#e2994b"
            android:textSize="12sp"
            android:layout_gravity="center"
            tools:text="密码过于简单,建议修改密码" />

        <ImageView
            android:id="@+id/iv_mine_risk_tips_close"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:paddingLeft="8dp"
            android:paddingRight="8dp"
            android:layout_gravity="end"
            android:src="@drawable/ic_del_mine_safe_tips" />
    </FrameLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值