点击效果实现的多种方法

要求:android项目中做一个默认图片变暗,有焦点时变亮的效果。

解决方案:经典的解决方案,一种是使用xml,一种是写在代码里。
  1.使用选择器selector
   eg:
    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android" >
      <item android:state_pressed="true" android:drawable="@drawable/index7_6"></item>
      <item android:state_pressed="false" android:drawable="@drawable/index7_7"></item>
      <item android:drawable="@drawable/index7_7"></item>
    </selector>

    引用:android:backgroud="@drawable/button_selector"
  2.如果在代码中设置
    可以根据ontouch的down事件和up事件来设置对应的图片
   eg:
 @Override
 public boolean onTouch(View v, MotionEvent event) {
  // TODO Auto-generated method stub
                //设置图片控件
  ImageButton ib=(ImageButton) v;
  if (event.getAction() == MotionEvent.ACTION_DOWN) {
   // 更改为按下时控件设置图片
   ib.setImageDrawable(R.drawable.focused);
  } else if (event.getAction() == MotionEvent.ACTION_UP) {
   // 改为抬起时清除滤镜
   ib.setImageDrawable(R.drawable.normal);
  }
  return false;
 }
   3.使用滤镜
    eg:
    @Override
 public boolean onTouch(View v, MotionEvent event) {
  // TODO Auto-generated method stub
                //设置图片控件
  ImageButton ib=(ImageButton) v;
                //获取图片
  Drawable drawable=(Drawable) ib.getDrawable();
                //定义效果
  PorterDuff pduff=new PorterDuff();
  if (event.getAction() == MotionEvent.ACTION_DOWN) {
   // 更改为按下时让图片设置滤镜
   drawable.setColorFilter(Color.GRAY,PorterDuff.Mode.MULTIPLY);
                        //控件设置图片
   ib.setImageDrawable(drawable);
  } else if (event.getAction() == MotionEvent.ACTION_UP) {
   // 改为抬起时清除滤镜
   drawable.clearColorFilter();
  }
  return false;
 }

    注:PorterDuff类
       PorterDuff:
         从上面我们可以看到PorterDuff.Mode为枚举类,一共有16个枚举值:
          1.PorterDuff.Mode.CLEAR 
            所绘制不会提交到画布上。
          2.PorterDuff.Mode.SRC
            显示上层绘制图片
          3.PorterDuff.Mode.DST
            显示下层绘制图片
          4.PorterDuff.Mode.SRC_OVER
            正常绘制显示,上下层绘制叠盖。
          5.PorterDuff.Mode.DST_OVER
            上下层都显示。下层居上显示。
          6.PorterDuff.Mode.SRC_IN
            取两层绘制交集。显示上层。
          7.PorterDuff.Mode.DST_IN
            取两层绘制交集。显示下层。
          8.PorterDuff.Mode.SRC_OUT
            取上层绘制非交集部分。
          9.PorterDuff.Mode.DST_OUT
            取下层绘制非交集部分。
         10.PorterDuff.Mode.SRC_ATOP
            取下层非交集部分与上层交集部分
         11.PorterDuff.Mode.DST_ATOP
            取上层非交集部分与下层交集部分
         12.PorterDuff.Mode.XOR
            异或:去除两图层交集部分
         13.PorterDuff.Mode.DARKEN
            取两图层全部区域,交集部分颜色加深
         14.PorterDuff.Mode.LIGHTEN
            取两图层全部,点亮交集部分颜色
         15.PorterDuff.Mode.MULTIPLY
            取两图层交集部分叠加后颜色
         16.PorterDuff.Mode.SCREEN
            取两图层全部区域,交集部分变为透明色

       4.介绍另一种方法,使ImageButton有按下的特效,只需要准备一张普通的图片,不需要按下效果的图片。

        直接看示例代码,
        ①创建 TouchLight 和 TouchDark 这两个 OnTouchListener,
        ②然后给 ImageButton 设置OnTouchListener就行了,
        ③如果使用TouchLight,则按下效果是按键变亮;另一个就是变暗。

import android.app.Activity;
import android.graphics.ColorMatrixColorFilter;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
 
public class TouchedAnimation extends Activity {
     
    public static final OnTouchListener TouchLight = new OnTouchListener() {
 
        public final float[] BT_SELECTED = new float[] {1,0,0,0,50,0,1,0,0,50,0,0,1,0,50,0,0,0,1,0};
        public final float[] BT_NOT_SELECTED = new float[] {1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0};
 
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                v.getBackground().setColorFilter(
                        new ColorMatrixColorFilter(BT_SELECTED));
                v.setBackgroundDrawable(v.getBackground());
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                v.getBackground().setColorFilter(
                        new ColorMatrixColorFilter(BT_NOT_SELECTED));
                v.setBackgroundDrawable(v.getBackground());
            }
            return false;
        }
    };
     
    public static final OnTouchListener TouchDark = new OnTouchListener() {
         
        public final float[] BT_SELECTED = new float[] {1,0,0,0,-50,0,1,0,0,-50,0,0,1,0,-50,0,0,0,1,0};
        public final float[] BT_NOT_SELECTED = new float[] {1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0};
         
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                v.getBackground().setColorFilter(
                        new ColorMatrixColorFilter(BT_SELECTED));
                v.setBackgroundDrawable(v.getBackground());
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                v.getBackground().setColorFilter(
                        new ColorMatrixColorFilter(BT_NOT_SELECTED));
                v.setBackgroundDrawable(v.getBackground());
            }
            return false;
        }
    };
 
        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        ImageButton ib1, ib2;
                ib1 = (ImageButton) findViewById(R.id.ImageButton01);
                ib2 = (ImageButton) findViewById(R.id.ImageButton02);
 
                ib1.setOnTouchListener(TouchLight);
                ib2.setOnTouchListener(TouchDark);
    }
}
   代码里的两个 float 数组里存的东西是颜色矩阵,不了解颜色矩阵也没关系,使用这个附件就行,只需调整亮度、对比度之类的值,然后把生产的颜色矩阵复制到代码里。
http://www.cnblogs.com/xiaowenji/archive/2011/02/04/1949165.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GalenFeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值