2016-04-24 16 views
0

Ich versuche, zwei (oder mehr) bewegliche TextViews zu machen und das ganze Set mit Pinch-to-Zoom skalierbar zu machen. Ich habe benutzerdefiniertes Layout von FrameLayout erstreckt:FrameLayout mit Gesten skalieren

public class BublinkyLayout extends FrameLayout { 
private ScaleGestureDetector mScaleDetector; 
private float mScaleFactor = 1.f; 
private float scale = 1; 

public BublinkyLayout(Context context) { 
    this(context, null, 0); 
} 

public BublinkyLayout(Context context, AttributeSet attrs) { 
    this(context, attrs, 0); 
} 

public BublinkyLayout(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    setWillNotDraw(false); 
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); 
} 

public void setScale(float scale) { 
    this.scale = scale; 
    invalidate(); 
} 

public float getScale() { 
    return this.scale; 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.scale(scale, scale); 
    super.onDraw(canvas); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    mScaleDetector.onTouchEvent(event); 
    final int action = MotionEventCompat.getActionMasked(event); 
    switch (action) { 
     case MotionEvent.ACTION_MOVE: 
      RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) this.getLayoutParams(); 
      this.setScale(mScaleFactor); 
      this.setLayoutParams(layoutParams); 
      this.invalidate(); 
      break; 
    } 
    return true; 
} 
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 
    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     mScaleFactor *= detector.getScaleFactor(); 

     mScaleFactor = Math.max(0.3f, Math.min(mScaleFactor, 1.5f)); 

     invalidate(); 
     return true; 
    } 
} 
} 

Aber wenn ich die ‚Pinch-to-Zoom‘ verwenden und Auszoomen, das Kind Textviews hat nicht die ‚Berührungszone‘ (die Zone, wo ich berühren kann sie und bewegen sie herum) aligniert mit ihnen. Es sieht so aus, als wäre das Layout skaliert, aber der Bereich ist immer noch derselbe, was bedeutet, dass ich sie nicht aus der Originalbox herausholen kann.

Hier ist OnTouchListener ich verwenden, um die Textviews zu bewegen:

public class BublinkaOnTouchListener implements View.OnTouchListener { 
private int _xDelta; 
private int _yDelta; 

@Override 
public boolean onTouch(View view, MotionEvent event) { 
    final int X = (int) event.getRawX(); 
    final int Y = (int) event.getRawY(); 
    switch (event.getAction() & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: 
      FrameLayout.LayoutParams lParams = (FrameLayout.LayoutParams) view.getLayoutParams(); 
      _xDelta = X - lParams.leftMargin; 
      _yDelta = Y - lParams.topMargin; 
      break; 
     case MotionEvent.ACTION_UP: 
      break; 
     case MotionEvent.ACTION_POINTER_DOWN: 
      break; 
     case MotionEvent.ACTION_POINTER_UP: 
      break; 
     case MotionEvent.ACTION_MOVE: 
      FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) view.getLayoutParams(); 
      layoutParams.leftMargin = X - _xDelta; 
      layoutParams.topMargin = Y - _yDelta; 
      layoutParams.rightMargin = -250; 
      layoutParams.bottomMargin = -250; 
      view.setLayoutParams(layoutParams); 
      view.invalidate(); 
      break; 
    } 
    return true; 
} 
} 

Dank für jede Antwort.

PS: Englisch ist nicht meine Muttersprache so sorry für Fehler :)

Antwort

0

ein answer gefunden, die vor allem mein Problem löst.

Es ist nicht meine endgültige Lösung, aber es hilft wirklich, dieses Problem zu lösen.