ImageButton 点击效果实现
使用Button时为了让用户有“按下”的效果,有两种实现方式:
1.在代码里面。
view plain
imageButton.setOnTouchListener(new OnTouchListener(){ ? ??
?? ? ? ? ? ? ? ? ? ? ? ?@Override ? ?
?? ? ? ? ? ? ? ? ? ? ? ?public boolean onTouch(View v, MotionEvent event) { ? ??
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if(event.getAction() == MotionEvent.ACTION_DOWN){ ? ??
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//更改为按下时的背景图片 ? ??
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?v.setBackgroundResource(R.drawable.pressed); ? ??
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}else if(event.getAction() == MotionEvent.ACTION_UP){ ? ??
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//改为抬起时的图片 ? ??
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?v.setBackgroundResource(R.drawable.released); ? ??
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?} ? ??
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return false; ? ??
?? ? ? ? ? ? ? ? ? ? ? ?} ? ??
?? ? ? ? ? ? ? ?}); ? ?
imageButton.setOnTouchListener(new OnTouchListener(){ ?
?? ? ? ? ? ? ? ? ? ? ? ?@Override ?
?? ? ? ? ? ? ? ? ? ? ? ?public boolean onTouch(View v, MotionEvent event) { ?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if(event.getAction() == MotionEvent.ACTION_DOWN){ ?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//更改为按下时的背景图片 ?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?v.setBackgroundResource(R.drawable.pressed); ?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}else if(event.getAction() == MotionEvent.ACTION_UP){ ?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//改为抬起时的图片 ?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?v.setBackgroundResource(R.drawable.released); ?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?} ?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return false; ?
?? ? ? ? ? ? ? ? ? ? ? ?} ??
?? ? ? ? ? ? ? ?}); ??
?
?
2.用XML文件实现。
view plain
<?xml version="1.0" encoding="UTF-8"?> ? ?
<selector xmlns:android="http://schemas.android.com/apk/res/android"> ? ?
?? ?<item ? ? ? ? ? android:state_pressed="false" ?android:drawable="@drawable/button_add" /> ? ?
?? ?<item ? ? ? ? ? android:state_pressed="true" ? android:drawable="@drawable/button_add_pressed" /> ? ?
?? ?<item ? ? ? ? ? android:state_focused="true" ? ?android:drawable="@drawable/button_add_pressed" /> ? ?
<item ? ? ? ? ? android:drawable="@drawable/button_add" /> ? ?
</selector> ? ?
?
<?xml version="1.0" encoding="UTF-8"?> ?
<selector xmlns:android="http://schemas.android.com/apk/res/android"> ?
<item ? ? ? ? ? android:state_pressed="false" ?android:drawable="@drawable/button_add" /> ?
?
?? ?<item ? ? ? ? ? ?android:state_pressed="true" ?android:drawable="@drawable/button_add_pressed" /> ?
?? ?<item ? ? ? ? ? ?android:state_focused="true" ?android:drawable="@drawable/button_add_pressed" /> ?
?? ?<item ? ? ? ? ? ? android:drawable="@drawable/button_add" /> ?
</selector> ??
?
?
这个文件放在drawable目录下面。命名为button_add_x.xml
使用的时候
view plain
<ImageButton ? ?
?? ? ? ? ? ? ? ? ? ? ? ?android:id="@+id/ImageButton" ? ?
?? ? ? ? ? ? ? ? ? ? ? ?android:layout_width="wrap_content" ? ?
?? ? ? ? ? ? ? ? ? ? ? ?android:layout_height="wrap_content" ? ?
?? ? ? ? ? ? ? ? ? ? ? ?android:background="#00000000" ? ?
?? ? ? ? ? ? ? ? ? ? ? ?android:src="@drawable/button_add_x" > ? ?
</ImageButton> ? ?
<ImageButton ?
?? ? ? ? ? ? ? ? ? ? ? ?android:id="@+id/ImageButton" ?
?? ? ? ? ? ? ? ? ? ? ? ?android:layout_width="wrap_content" ?
?? ? ? ? ? ? ? ? ? ? ? ?android:layout_height="wrap_content" ?
?? ? ? ? ? ? ? ? ? ? ? ?android:background="#00000000" ?
?? ? ? ? ? ? ? ? ? ? ? ?android:src="@drawable/button_add_x" > ?
</ImageButton> ??
?
【以上为引用网络,来源:http://www.eoeandroid.com/thread-7931-1-1.html】
?
【以下为原创,转载请注明出处:http://blog.csdn.net/sytzz/archive/2010/06/16/5673662.aspx】
?
我自己摸索摸索,发现这样的实现过程虽然通用性好,但是很麻烦,一个按钮实现效果需要多张图片甚至再加一个布局…
?
那一个游戏要是有几百个按钮怎么办呢?
?
于是:以下代码被酝酿出来了:
?
view plain
?
??public final static float[] BT_SELECTED=new float[] { ? ? ?
?? ? ?2, 0, 0, 0, 2, ? ? ?
?? ? ?0, 2, 0, 0, 2, ? ? ?
?? ? ?0, 0, 2, 0, 2, ? ? ?
?? ? ?0, 0, 0, 1, 0 }; ? ??
?
?
??public final static 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 }; ? ??
?
?
??public final static OnFocusChangeListener buttonOnFocusChangeListener=new OnFocusChangeListener() { ? ??
?
??@Override ? ?
??public void onFocusChange(View v, boolean hasFocus) { ? ??
?? if (hasFocus) { ? ??
?? ?v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_SELECTED)); ? ??
?? ?v.setBackgroundDrawable(v.getBackground()); ? ??
?? } ? ??
?? else ? ?
?? { ? ??
?? ?v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_NOT_SELECTED)); ? ??
?? ? v.setBackgroundDrawable(v.getBackground()); ? ??
?? } ? ??
??} ? ??
?}; ? ??
?
?
?public final static OnTouchListener buttonOnTouchListener=new OnTouchListener() { ? ??
??@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 final static void setButtonFocusChanged(View inView) ? ??
?{ ? ??
??inView.setOnTouchListener(buttonOnTouchListener); ? ??
??inView.setOnFocusChangeListener(buttonOnFocusChangeListener); ? ??
?} ? ?
?
使用时,调用方法
public final static void setButtonFocusChanged(View inView)
即可。
?
【原理】
?
利用Drawable类的setColorFilter方法对图片进行颜色偏移过滤处理。