如何更改焦点/按下ImageButton的色调

我在我的应用程序中有一个ImageButton ,当pressed/focusedbutton时,我需要更改图像的色调。 我有ImageButton设置为从XML文件中获取其src ,如下所示:

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- pressed --> <item android:state_pressed="true" android:tint="@color/black" android:drawable="@drawable/search" /> <!-- focused --> <item android:state_focused="true" android:tint="@color/black" android:drawable="@drawable/search" /> <!-- default --> <item android:tint="@null" android:drawable="@drawable/search" /> </selector> 

但是,当ImageButton被按下或对焦时,不会应用色调 – 图像只是正常显示。 颜色黑色一直定义为#000000 。 有任何想法吗?

您可以通过以下代码轻松更改色调:

 ImageButton button = (ImageButton) this.findViewById(R.id.button_i_want_to_modify); button.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint 

希望能帮助到你。

JS

最后我find了API <21的解决scheme:

 Button more = (Button) findViewById(R.id.more); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { more.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_IN); } else { Drawable wrapDrawable = DrawableCompat.wrap(more.getBackground()); DrawableCompat.setTint(wrapDrawable, color)); more.setBackgroundDrawable(DrawableCompat.unwrap(wrapDrawable)); } 

愿这帮助别人不要失去2个小时!

我find了一种方法来做到这一点在XML(在API 21和至less)。

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" > <bitmap android:src="@drawable/search" android:tint="@color/black" /> </item> <item android:drawable="@drawable/search"/> </selector> 

通过在位图上设置色调,可以在xml中重复使用相同的drawable,而无需拦截触摸或子类ImageView或ImageButton。

一旦创build了select器,只需将其应用为ImageView或ImageButton的src即可。

 bt.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: bt.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint return true; // if you want to handle the touch event case MotionEvent.ACTION_UP: bt.clearColorFilter(); // White Tint return true; // if you want to handle the touch event } return false; } }); 

我正在做的是添加一个自定义button,具有函数setColorFilter。

像这样我可以在xml中使用新的button。

 public class CustomButton extends Button { public CustomButton(Context context) { super(context); } public CustomButton(Context context, AttributeSet attributes) { super(context, attributes); }; @Override public boolean onTouchEvent(MotionEvent event) { int maskedAction = event.getActionMasked(); if (maskedAction == MotionEvent.ACTION_DOWN) getBackground().setColorFilter(Color.argb(150, 155, 155, 155), PorterDuff.Mode.DST_IN); else if (maskedAction == MotionEvent.ACTION_UP) getBackground().setColorFilter(null); return super.onTouchEvent(event); }} 

和ImageButton

 public class CustomImageButton extends ImageButton { public CustomImageButton(Context context) { super(context); } public CustomImageButton(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent event) { int maskedAction = event.getActionMasked(); if (maskedAction == MotionEvent.ACTION_DOWN) setColorFilter(Color.argb(150, 155, 155, 155), PorterDuff.Mode.DST_IN); else if (maskedAction == MotionEvent.ACTION_UP) setColorFilter(null); return super.onTouchEvent(event); }} 

我注意到这里有一些要求知道如何在XML中执行此操作的请求。 其实很简单。 这可以使用layer-list

你的button的drawable(drawable / some_button.xml):

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/some_button_highlighted" /> <item android:drawable="@drawable/some_button_image" /> </selector> 

这是突出显示的drawable(drawable / some_button_highlighted.xml)

 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/some_button_image"/> <item> <shape> <solid android:color="@color/highlighted_button_color" /> </shape> </item> </layer-list> 

现在你可以在任何其他的XML中使用它:

 ... android:drawable="@drawable/some_button" ... 

我希望这将有助于未来的人。

这里是如何使用XML来做到这一点。 在你的drawable文件夹中创build一个select器。 例如:touch_selector.xml

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- State when a row is being pressed, but hasn't yet been activated (finger down) --> <item android:state_pressed="true" android:color="@color/semi_slate" /> <!-- When the view is "activated". In SINGLE_CHOICE_MODE, it flags the active row of a ListView --> <item android:state_activated="true" android:color="@color/semi_slate" /> <!-- Default, "just hangin' out" state. --> <item android:color="@android:color/transparent" /> </selector> 

在我的xml图像视图中,我将android:tint属性设置为上面创build的drawable。

 android:tint = "@drawable/touch_selector" 

整个代码看起来像这样:

 <?xml version="1.0" encoding="utf-8"?> <ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/poster" android:layout_width="match_parent" android:layout_height="match_parent" android:adjustViewBounds="true" android:scaleType="centerCrop" android:tint="@drawable/touch_selector" /> 

这是一个所有的XML解决scheme,在印刷机上或在主动上的色调。 类似的可以为ImageButton完成

你可以从xml设置颜色(色调)。

background设置transparentandroid:background="@null" )然后使用tint

 <ImageButton android:layout_width="wrap_content" android:layout_height="fill_parent" android:tint="@color/Amber_200" android:background="@null" android:src="@drawable/back_selector" /> 

当你将select器定义为ImageButton的src时,Android将会AFAIK只需要drawable,因为这与src的types相匹配。 所以色彩不会被使用。

然而,我有一个类似的问题:我也尝试使用类似于你的select器,而不是android:src的ImageButton的android:tint值。 当然,我省略了select器中的色调值。 这也可以解决你的问题,因为你想在所有状态中使用相同的drawable。 奇怪的是,我每次都得到一个NumberFormatException,说明系统无法将res / color / tint_selector.xml(这确实是我的select器)parsing为整数。 具体来说,我的代码如下所示:

这是我的select器,保存在/res/color/tint_selector.xml中:

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:color="#D3D3D3"/> <!-- pressed --> <item android:color="#ff000000"/> <!-- default --> </selector> 

这是相应的ImageButton:

 <ImageButton android:id="@+id/program_help" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/symbol" android:tint="@color/tint_selector"> </ImageButton> 

也许这可以帮助你一点,虽然它目前不工作。