Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: child view outside of its parent doesn't respond to click events

For having effects I scale up the child view which cause child view to go out side of its parent view. I have a button in child view, it works before scaling but after scaling doesn't work. what is going wrong? see image below:

button outside doesn't work

for scaling child I use this code:

            childView.bringToFront();
            Animation a = new Animation() {
                @Override
                protected void applyTransformation(float t, Transformation trans) {
                    float scale = 1f * ( 1 - t ) + SCALE_UP_FACTOR * t;
                    childView.setScaleX(scale);
                    childView.setScaleY(scale);
                }

                @Override
                public boolean willChangeBounds() {
                    return true;
                }
            };
            a.setDuration(ANIM_DURATION);
            a.setInterpolator(new Interpolator() {
                @Override
                public float getInterpolation(float t) {
                    t -= 1f;
                    return (t * t * t * t * t) + 1f; // (t-1)^5 + 1
                }
            });
            childView.startAnimation(a); 

the parent is a ViewPager :

     <ViewPager
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/invoice_list_view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#f5f5f5"
        android:layout_gravity="center"
        android:clipChildren="false"
        android:clipToPadding="false"
        />
like image 886
Mneckoee Avatar asked Aug 21 '16 06:08

Mneckoee


1 Answers

This should do the trick:

final View grandParent = (View) childView.getParent().getParent();
grandParent.post(new Runnable() {
    public void run() {
        Rect offsetViewBounds = new Rect();
        childView.getHitRect(offsetViewBounds);

        // After scaling you probably want to append your view to the new size.
        // in your particular case it probably could be only offsetViewBounds.right:
        // (animDistance - int value, which you could calculate from your scale logic)
        offsetViewBounds.right = offsetViewBounds.right + animDistance;

        // calculates the relative coordinates to the parent
        ((ViewGroup)parent).offsetDescendantRectToMyCoords(childView, offsetViewBounds);
        grandParent.setTouchDelegate(new TouchDelegate(offsetViewBounds, childView));
    }
});

Though I'm not sure whether it will work with Animation, but for scaling you could use something like that instead:

float scale = ...; // your scale logic

ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(childView, 
        PropertyValuesHolder.ofFloat("scaleX", scale),
        PropertyValuesHolder.ofFloat("scaleY", scale));
animator.setDuration(ANIM_DURATION);
animator.start();

And pay attention to the line android:clipChildren="false" for your parent view in XML-file.

like image 115
Sergey Avatar answered Oct 20 '22 23:10

Sergey