This worked perfectly! I don't need ACTION_MOVE anymore. I knew there was a 
simple solution for this. Thanks.


Am Dienstag, 26. Februar 2013 00:04:28 UTC+1 schrieb bob:
>
> You need to process ACTION_CANCEL.  If a user presses the button and 
> slides his finger off the button before lifting it up, that's a cancel.
>
>
>
> On Monday, February 25, 2013 4:51:18 PM UTC-6, user123 wrote:
>>
>> I want to apply certain transforms to a view and it's children during 
>> pressed state, e.g. a color filter. 
>>
>> As far my current knowledge, I can't do this using StateListDrawable or 
>> XML configuration.
>>
>> The concrete situation: A GridView where the cells have a background 
>> drawable, an ImageView, and text. When the user is pressing a cell, I want 
>> to change the background, to apply a PorterDuff color filter to the image, 
>> and change the color of the text. The images are downloaded from the web.
>>
>> My first try was to generate bitmaps for both states (pressed and not 
>> pressed) at runtime, inflating the layout twice and using 
>> `getDrawingCache()`. Then create a StateListDrawable and set both states. 
>> Wasn't a complete fail but I started getting some strange issues, and I 
>> think this will also not allow we to recycle views (Edit: But I might 
>> continue that path if the following approach is wrong).
>>
>> So I tried a completly different thing - set touch listener on each cell, 
>> which works like this:
>>
>> view.setOnTouchListener(new OnTouchListener() {
>>     @Override
>>     public boolean onTouch(View v, MotionEvent event) {
>>         int x = (int)event.getX();
>>         int y = (int)event.getY();
>>         int space = 10;
>>        
>>         switch(event.getAction() & MotionEvent.ACTION_MASK) {
>>             case MotionEvent.ACTION_DOWN:
>>                 moved = false;
>>                 pressedX = x;
>>                 pressedY = y;
>>                
>>                 //apply color filter
>>                 //do other changes
>>                
>>                 return true;
>>             case MotionEvent.ACTION_UP:
>>                 if (!moved) {
>>                     //clear color filter
>>                     //undo other changes
>>                     return true;
>>                 }
>>             case MotionEvent.ACTION_MOVE:
>>                 if (Math.abs(x - pressedX) > space || Math.abs(y - 
>> pressedY) > space) {
>>                     moved = true;
>>                     //clear color filter
>>                     //undo other changes
>>                     return true;
>>                 }
>>         }
>>     return false;
>>     }
>> }); 
>>
>> But the ACTION_MOVE part here is basically a hack, and also doesn't work 
>> well. First, it makes that the pressed state finishes while the user is 
>> moving inside the cell. Not tragic, but doesn't have to be necessarily this 
>> way. But it has the bug, that when the user moves out of the cell very 
>> quickly - or starts at the edges and moves out - such that there's no 
>> ACTION_UP in the cell and sometimes ACTION_MOVE is not even called, or the 
>> value is less than space, the cell keeps pressed!
>>
>> So, in order to solve that, I thought about adding an OnTouchListener to 
>> the parent view of the grid / the activity, and check on ACTION_MOVE if 
>> it's outside of the grid and then loop through the cells and reset pressed 
>> state... but you see this is ugly and also bad performance.
>>
>> And I don't know if I'm missing an easy solution and running 
>> unnecessarily in complications.
>>
>> Does anybody have an advice for this?
>>
>> Thanks in advance. 
>>
>

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to