2016-08-21 4 views
3

Für Effekte Ich vergrößere die Kind-Ansicht, die Ursache Kindseite zu Seite der Elternansicht zu gehen. Ich habe eine Schaltfläche in der untergeordneten Ansicht, es funktioniert vor der Skalierung, aber nach der Skalierung funktioniert nicht. Was läuft falsch? siehe Bild unten:Android: Kind Ansicht außerhalb seiner Eltern reagiert nicht auf Klickereignisse

button outside doesn't work

für Kinder Skalierung Ich benutze diesen 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); 

die Eltern ist ein 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" 
     /> 
+0

Bitte geben Sie Ihren Code in Ihrer Aktivität oder Fragment und auch das XML Ihres Layouts –

+0

Reagiert die Schaltfläche, wenn Sie auf die ursprüngliche (unskalierte) Position tippen, wenn die Ansicht skaliert wird? – Barend

+0

@Barend wie ich in Frage erwähnt: "Es funktioniert vor der Skalierung, aber nach der Skalierung funktioniert nicht" – Mneckoee

Antwort

1

Dies sollte den 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)); 
    } 
}); 

Obwohl ich bin nicht sicher, ob es mit Animation funktionieren wird, aber für die Skalierung Sie könnte etwas wie das statt:

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

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

Und achten Sie auf die Linie android:clipChildren="false" für Ihre übergeordneten Ansicht in XML-Datei.

+0

Dies funktioniert nicht, da Sie selbst dann, wenn Sie den Berührungsdelegaten verwenden, die Grenzen der übergeordneten Ansichten mit einem berührbaren Bereich nicht überschreiten können. Bedeutungen Klicks werden nicht vom Eltern registriert, wenn sie außerhalb seiner Ansichtsgrenzen durchgeführt werden und daher nicht an die Schaltfläche weitergeleitet werden können. – Csharpest

+1

@Csharpest in diesem Fall, dass Sie immer anstelle von Muttergroßmutter nennen. '' 'final ansehen parent = (View) childView.getParent() getParent();' '' ich es getestet. Es klappt. In meiner Antwort geändert. – Sergey

+0

Verdammt, das wusste ich nicht, und das habe ich verpasst. Sie könnten sogar Ihre Elternvariable "grandParent" dann anrufen: P. Danke für die Info – Csharpest

Verwandte Themen