android图片优化之不用selector

相信大家写按钮按压变化背景或者点击切换背景都用过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);
                }
            }
        });
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值