Reputation: 2116
In Android, whenever I click a button (namely an ImageButton), I want to give the user feedback by changing the color of the button (maybe inverting colors, or darkening, etc). At this point, I don't want to change to a new button or anything, just want to change state so as to reflect the click.
I realize I can add a new drawable, so each button would have 2 states (when clicked, I would change to the second state).
That is (pseudocode):
onClick {
ImageButton.setDrawable(R.drawable.myclickedbutton)
}
Is there a better way to do this (I believe iOS will play with ImageColors for you when you click, and that's what I want here in Android), or is what I am thinking the only possibility?
I feel I'm missing something major with this concept.
Thanks in Advance.
Edit: If it makes a difference, my app runs on minimum target 2.2.
Edit 2: For clarification, I'm working with an Image Button which already has a custom drawable resource. That's what I want to manipulate onClick.
Edit 3: I don't think I'm being clear enough here. I know how to change the state using two drawables (whether it be onTouch, XML, onClick, etc.) I was asking if there was a way that Android (or some sort of method) can invert or darken colors for all buttons automatically when clicked (as iOS does, I believe). I am not asking how to do this on a button-to-button basis. This can be accomplished with 2 drawables per button, and I realize that.
Upvotes: 0
Views: 3749
Reputation: 2494
You can use onTouchListener for button and change the state of button according to button click..
button.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN)
{
// here u can change the button color or image as clickable as
button.setBackgroundImage(R.drawable.image_pressed);
}
if(event.getAction()==MotionEvent.ACTION_UP)
{
// here u can change the button color or image as released as
button.setBackgroundImage(R.drawable.image_released);
}
return false;
}
});
I think it may helpful to you..
Upvotes: 0
Reputation: 412
You dont have to use the code you mentioned in order to switch the drawables . Rather create a drawable with two different states.
As you said you already have custom drawables, you can use them for different states.
<?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/drawable1" /> <!-- for clicked state-->
<item android:drawable="@drawable/drawable2" /> <!-- for normal state-->
</selector>
place this xml as drawable_1.xml in drawable folder and use this drawable in your code,
yourButton.setDrawable(R.drawable.drawable_1)
Upvotes: 0
Reputation: 21181
button.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true">
<shape android:shape="rectangle">
<corners android:radius="5dp"/>
<solid android:color="#f00"/>
<padding android:left="10.0dip" android:top="10.0dip"
android:right="10.0dip" android:bottom="10.0dip"/>
<stroke android:width="1.0dip" android:color="#222"/>
</shape>
</item>
<item android:state_pressed="false">
<shape android:shape="rectangle">
<corners android:radius="5dp"/>
<solid android:color="#f1f1f1"/>
<padding android:left="10.0dip" android:top="10.0dip"
android:right="10.0dip" android:bottom="10.0dip"/>
<stroke android:width="1.0dip" android:color="#222"/>
</shape>
</item>
</selector>
Apply this button as background
<Button
android:background="@drawable/button"/>
and in your class file do like this
public void onClick(View v) {
pressedButton.setPressed(true);
}
so that the red color will be stable
Upvotes: 2