您的位置:首页 > 移动开发 > Android开发

Android中ImageButton自定义按钮的按下效果的代码实现方法,附网上2种经典解决方法

2010-10-14 17:51 941 查看





【原创】Android中ImageButton自定义按钮的按下效果的代码实现方法,附网上2种经典解决方法。
收藏

首先看看网上的
2


种方法:



【以下为引用网络,来源: http://www.eoeandroid.com/thread-7931-1-1.html




使用
Button


时为了让用户有“按下”的效果,有两种实现方式:


1.


在代码里面。




view plain
copy to clipboard
print
?

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
;

}

});

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
copy to clipboard
print
?

<?
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
>

<?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
copy to clipboard
print
?

<
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
>

<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
copy to clipboard
print
?

/**

* 按下这个按钮进行的颜色过滤

*/

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
;

}

};

/**

* 设置图片按钮获取焦点改变状态

* @param inImageButton

*/

public

final

static

void
setButtonFocusChanged(View inView)

{

inView.setOnTouchListener(buttonOnTouchListener);

inView.setOnFocusChangeListener(buttonOnFocusChangeListener);

}

/**

* 按下这个按钮进行的颜色过滤

*/

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
;

}

};

/**

* 设置图片按钮获取焦点改变状态

* @param inImageButton

*/

public

final

static

void
setButtonFocusChanged(View inView)

{

inView.setOnTouchListener(buttonOnTouchListener);

inView.setOnFocusChangeListener(buttonOnFocusChangeListener);

}

/**
* 按下这个按钮进行的颜色过滤
*/
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;
}
};

/**
* 设置图片按钮获取焦点改变状态
* @param inImageButton
*/
public final static void setButtonFocusChanged(View inView)
{
inView.setOnTouchListener(buttonOnTouchListener);
inView.setOnFocusChangeListener(buttonOnFocusChangeListener);
}
/**
* 按下这个按钮进行的颜色过滤
*/
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;
}
};

/**
* 设置图片按钮获取焦点改变状态
* @param inImageButton
*/
public final static void setButtonFocusChanged(View inView)
{
inView.setOnTouchListener(buttonOnTouchListener);
inView.setOnFocusChangeListener(buttonOnFocusChangeListener);
}




使用时,调用方法



public final static void setButtonFocusChanged(View inView)



即可。



【原理】



利用
Drawable


类的
setColorFilter


方法对图片进行颜色偏移过滤处理。


以下为效果图,登陆按钮此时为获取焦点状态。








代码可以适当修改实现
3


个不同的状态:正常,获取焦点,点击。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐