相信大家写按钮按压变化背景或者点击切换背景都用过selector吧,但是这个是会浪费内存的。如果是将Button的背景设置为selector,在初始化Button的时候会将正反选图片都加载在内存中(具体可以查看Android源码,在类Drawable.java的createFromXmlInner方法中对图片进行解析,最终调用Drawable的inflate方法),相当于一个按钮占用了两张相同大小图片所使用的内存,如果一个界面上按钮很多或者是按钮很大,光是按钮占用的内存就会很大,可以通过在布局文件中给按钮只设置正常状态下的背景图片,然后在代码中监听按钮的点击状态,当按下按钮时为按钮设置反选效果的图片,抬起时重新设置为正常状态下的背景,具体实现方式如下:
package com.example.admin.imageyouhua;
import android.view.MotionEvent;
import android.view.View;
/**
* Created by admin on 2017/2/28.
*/
public class ImageButtonClickUtils {
private ImageButtonClickUtils(){
}
/**
* 设置按钮的正反选效果
*
* */
public static void setClickState(View view, final int normalResId, final int pressResId){
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:{
v.setBackgroundResource(pressResId);
}
break;
case MotionEvent.ACTION_MOVE:{
v.setBackgroundResource(pressResId);
}
break;
case MotionEvent.ACTION_UP:{
v.setBackgroundResource(normalResId);
}
break;
default:{
}
break;
}
// 为了不影响监听按钮的onClick回调,返回值应为false
return false;
}
});
}
static boolean flag=true;
public static void setCheckState(View view, final int normalResId, final int pressResId){
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (flag){
flag=false;
view.setBackgroundResource(pressResId);
}else {
flag=true;
view.setBackgroundResource(normalResId);
view.setClickable(true);
}
}
});
}
}