Referring to Android: How to achieve the glow effect when long-pressing a list item?
By applying list_selector_holo_light.xml on a linear layout's background (Which is NOT being used in ListView) , I thought I can achieve glowing animation effect by long press on it.
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:drawable="#android:color/transparent" />
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="#drawable/list_selector_disabled_holo_light" />
<item android:state_focused="true" android:state_enabled="false" android:drawable="#drawable/list_selector_disabled_holo_light" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="#drawable/list_selector_background_transition_holo_light" />
<item android:state_focused="false" android:state_pressed="true" android:drawable="#drawable/list_selector_background_transition_holo_light" />
<item android:state_focused="true" android:drawable="#drawable/list_focused_holo" />
</selector>
However, I do not see the transition animation effect, to transits from light blue to dark blue.
Is there anything else I had missed out?
Related
I want to create an animation like material ripple animation, so I decided to look at its source code.
The enter point is :
android:background="?android:attr/selectableItemBackground">
go to: Android\Sdk\platforms\android-30\data\res\values\attrs.xml
<!-- Background drawable for bordered standalone items that need focus/pressed states. -->
<attr name="selectableItemBackground" format="reference" />
Next we go into Android\Sdk\platforms\android-30\data\res\values\themes.xml
<item name="selectableItemBackground">#drawable/item_background</item>
Nothing special, just another drawable.
Next in: Android\Sdk\platforms\android-30\data\res\drawable\item_background.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:drawable="#color/transparent" />
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="#drawable/list_selector_background_disabled" />
<item android:state_focused="true" android:state_enabled="false" android:drawable="#drawable/list_selector_background_disabled" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="#drawable/list_selector_background_transition" />
<item android:state_focused="false" android:state_pressed="true" android:drawable="#drawable/list_selector_background_transition" />
<item android:state_focused="true" android:drawable="#drawable/list_selector_background_focused" />
<item android:drawable="#color/transparent" />
</selector
We are close, in this file we saw drawables of different states. Transition file at:
Android\Sdk\platforms\android-30\data\res\drawable\list_selector_background_transition.xml is:
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#android:drawable/list_selector_background_pressed" />
<item android:drawable="#android:drawable/list_selector_background_longpress" />
</transition>
Finaly we have 4 files, in picture below
So the questions is:
How this 4 squares turns into this circular ripple animation?
That means this black pointers?
what the orange fill and green border do ?
(optional) Where is the magic part?
I have made three different images for a next button in my activity. A focused image, normal image and an image when the button is not enabled.
However, I wanted to test it and see how ot looks when it's not been enabled.
So on start I set it to false and it does work, I cannot touch it and it does not change to focused anymore, but the image does not change.
The ImageButton from my layout.
<ImageButton
android:id="#+id/nextButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#null"
android:padding="5dp"
android:src="#drawable/nextbutton" />
The selector file nextbutton.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#drawable/btn_next_focused" android:state_focused="true" android:state_pressed="true"/>
<item android:drawable="#drawable/btn_next_focused" android:state_focused="false" android:state_pressed="true"/>
<item android:drawable="#drawable/btn_next_focused" android:state_focused="true"/>
<item android:drawable="#drawable/btn_next" android:state_focused="false" android:state_pressed="false"/>
<item android:drawable="#drawable/btn_next_disabled" android:state_enabled="false"/>
</selector>
What is wrong? It'll only change to focused and normal state but never to the disabled one. (I just noticed that it might be the wrong word for it...).
I found it out. I still don't know for sure why but I have a clue. I had to this line to every other item in the selector.
android:state_enabled="false"
So it looks like this :
<item android:drawable="#drawable/btn_next_focused" android:state_focused="true" android:state_pressed="true" android:state_enabled="false" />
<item android:drawable="#drawable/btn_next_focused" android:state_focused="false" android:state_pressed="true" android:state_enabled="false" />
<item android:drawable="#drawable/btn_next_focused" android:state_focused="true" android:state_enabled="false" />
<item android:drawable="#drawable/btn_next" android:state_focused="false" android:state_pressed="false" android:state_enabled="false" />
I have a button and I want it to have different background when I set:
android:enabled="false"
Here's resource file for background:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false"
android:drawable="#drawable/bttn_orange_normal" /> <!-- pressed -->
<item android:state_pressed="true"
android:drawable="#drawable/bttn_orange_selected" /> <!-- focused -->
<item android:state_enabled="false" android:drawable="#drawable/bttn_grey_disabled"/>
<item android:state_enabled="true" android:drawable="#drawable/bttn_orange_normal"/>
</selector>
But button still has normal background when it is disabled.
What am I missing?
Put this line :
<item android:state_enabled="false" android:drawable="#drawable/bttn_grey_disabled"/>
as first item (it must be first item, otherwise it will not work) of the selector tag.
Final :
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:drawable="#drawable/bttn_grey_disabled"/>
<item android:state_pressed="false"
android:drawable="#drawable/bttn_orange_normal" /> <!-- pressed -->
<item android:state_pressed="true"
android:drawable="#drawable/bttn_orange_selected" /> <!-- focused -->
<item android:state_enabled="true" android:drawable="#drawable/bttn_orange_normal"/> <!-- idle state -->
</selector>
Vincent Ducastel's answer is correct, however it does not describe why the solution works.
When Android traverses the list of available items, it traverses the list from top to bottom, in each case evaluating whether the current state of the view matches the states defined for each item. It then selects the first item that matches the conditions and ignores the rest.
This is why you should always provide a default item at the bottom of the list and also provides a means of displaying complex selection conditions. For example if you wanted to have a special pressed state when the item is disabled, you would define the following items:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
...
<item android:state_enabled="false" android:state_pressed="false" android:drawable="#drawable/btn_grey_disabled"/>
<item android:state_enabled="false" android:state_pressed="true" android:drawable="#drawable/btn_white_disabled_selected"/>
...
</selector>
Added example of Active, Default and Disable State
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--Disable-->
<item android:drawable="#drawable/ic_button_disable"
android:state_enabled="false"
android:state_pressed="false" />
<item android:drawable="#drawable/ic_button_disable_touch"
android:state_enabled="false"
android:state_pressed="true" />
<!--Default-->
<item android:drawable="#drawable/ic_button_default"
android:state_pressed="false"
android:state_selected="false" />
<item android:drawable="#drawable/ic_button_default_touch"
android:state_pressed="true"
android:state_selected="false" />
<!--Active-->
<item android:drawable="#drawable/ic_button_active"
android:state_enabled="true"
android:state_selected="true"
android:state_pressed="false" />
<item android:drawable="#drawable/ic_button_active_touch"
android:state_enabled="true"
android:state_pressed="true"
android:state_selected="true" />
</selector>
I have set a custom list selector for a Simple ListView but when I select an item, the whole ListView turns blue. I don't understand where the problem is.
This is my ListView:
<ListView android:id="#+id/TopListView" android:layout_width="fill_parent"
android:listSelector="#drawable/regular_selector"
android:layout_height="wrap_content">
</ListView>
and it's the regular_selector.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:state_focused="true"
android:drawable="#color/transparent" />
<item android:state_pressed="true"
android:drawable="#color/blue" />
<item android:state_focused="true"
android:drawable="#color/blue" />
</selector>
I was having the same issue of the whole list view highlighting, when using a color as the background. Curiously this only happened below api 11.
Solution was to use a solid shape drawable to wrap the colour:
list_selector_shaped_background_press.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="#color/list_selector_pressed"/>
</shape>
List_selector_background.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_window_focused="false"
android:drawable="#android:color/transparent" />
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:state_focused="true" android:state_enabled="false"
android:state_pressed="true"
android:drawable="#drawable/list_selector_background_disabled" />
<item android:state_focused="true" android:state_enabled="false"
android:drawable="#drawable/list_selector_background_disabled" />
<!-- this has to be in a shaped drawable otherwise the whole list is highlighted selects -->
<item android:state_focused="true" android:state_pressed="true"
android:drawable="#drawable/list_selector_shaped_background_pressed" />
<item android:state_focused="false" android:state_pressed="true"
android:drawable="#drawable/list_selector_shaped_background_pressed" />
<item android:state_focused="true"
android:drawable="#drawable/list_selector_background_focus" />
</selector>
I guess it is the usual problem. You have to set this in your listview:
android:cacheColorHint="#00000000"
The goal is to disable an optimization that the framework does for improving drawing performance during scrolling operations.
When I set the regular_selector.xml as listview item background it work!
For the default android button, when I click on it, its color is changed to orange for a few seconds (for notifying the user the button is clicked). Anyway, I don't want this property. I don't want to change my button color. How can I disable this property?
Have a look on how button is styled by Android:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:state_enabled="true"
android:drawable="#drawable/btn_default_normal" />
<item android:state_window_focused="false" android:state_enabled="false"
android:drawable="#drawable/btn_default_normal_disable" />
<item android:state_pressed="true"
android:drawable="#drawable/btn_default_pressed" />
<item android:state_focused="true" android:state_enabled="true"
android:drawable="#drawable/btn_default_selected" />
<item android:state_enabled="true"
android:drawable="#drawable/btn_default_normal" />
<item android:state_focused="true"
android:drawable="#drawable/btn_default_normal_disable_focused" />
<item
android:drawable="#drawable/btn_default_normal_disable" />
</selector>
To style your button with Android's themes images resources, just create your own selector by copying the Android's one and replace all #drawable/btn_default_* by #android:drawable/btn_default_normal in items tag (and just remove items you don't want). For example :
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true"
android:drawable="#android:drawable/btn_default_normal" />
</selector>
Then, apply this drawable selector as a android:background of your button.
Hope it helps.
(If you want, I can also provide an example of applying this background easily to all your buttons, just ask.)