2016-06-02 2 views
-1

Я пытаюсь изменить высоту ImageView только одним движением пальца (вверх или вниз). Приведенный ниже код изменяет высоту двумя пальцами (например, защемление или реверс). Как я могу изменить этот код, чтобы делать то, что хочу? Благодарю.Изменение размера изображения с помощью только одного движения пальца вместо двух

public class MainActivity extends Activity { 


    private ImageView iv; 
    private Matrix matrix = new Matrix(); 
    private float scale = 1f; 
    private ScaleGestureDetector SGD; 



    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     iv = iv=(ImageView)findViewById(R.id.imageView); 
     SGD = new ScaleGestureDetector(this, new ScaleListener()); 

    } 

    public boolean onTouchEvent(MotionEvent ev) { 
     SGD.onTouchEvent(ev); 
     return true; 
    } 

    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener 
    { 
     @Override 
     public boolean onScale(ScaleGestureDetector detector) { 
      scale *= detector.getScaleFactor(); 
      scale = Math.max(0.1f, Math.min(scale, 5.0f)); 

      matrix.setScale(1, scale); 
      iv.setImageMatrix(matrix); 
      return true; 
     } 
    } 
} 
+0

Возможно, это поможет: https://developer.android.com/training/gestures/movement.html –

ответ

1

Использование GestureDetector для прокрутки:

@Bind(R.id.container) 
ViewGroup container; 

@Bind(R.id.image) 
ImageView image; 
private GestureDetectorCompat detector; 
private float yscale = 1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main2); 
    ButterKnife.bind(this); 
    image.setScaleType(ImageView.ScaleType.MATRIX); 

    detector = new GestureDetectorCompat(this, new GestureDetector.SimpleOnGestureListener() { 

     @Override 
     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
      Matrix m = new Matrix(); 
      yscale += distanceY/container.getHeight(); 
      m.setScale(1, yscale, 0, 0); 
      image.setImageMatrix(m); 
      return true; 
     } 
    }); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    return detector.onTouchEvent(event); 
} detector.onTouchEvent(event); 
} 
+0

Спасибо за ваш ответ. Как установить верхний размер как фиксированный и изменить размер снизу? – jason

+0

Okey Я исправил его, спасибо, я дам вашу награду за 22 часа – jason

+0

@jason Вы были быстрее. Я редактирую свой ответ. – HotIceCream

-1

Этот код snipet должен помочь вам обнаружить вверх и вниз

private VelocityTracker mVelocityTracker = null; 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     int index = event.getActionIndex(); 
     int action = event.getActionMasked(); 
     int pointerId = event.getPointerId(index); 

     switch(action) { 
      case MotionEvent.ACTION_DOWN: 
       if(mVelocityTracker == null) { 
        // Retrieve a new VelocityTracker object to watch the velocity of a motion. 
        mVelocityTracker = VelocityTracker.obtain(); 
       } 
       else { 
        // Reset the velocity tracker back to its initial state. 
        mVelocityTracker.clear(); 
       } 
       // Add a user's movement to the tracker. 
       mVelocityTracker.addMovement(event); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       mVelocityTracker.addMovement(event); 
       // When you want to determine the velocity, call 
       // computeCurrentVelocity(). Then call getXVelocity() 
       // and getYVelocity() to retrieve the velocity for each pointer ID. 
       mVelocityTracker.computeCurrentVelocity(1000); 
       // Log velocity of pixels per second 
       // Best practice to use VelocityTrackerCompat where possible. 
       Log.d("", "X velocity: " + 
         VelocityTrackerCompat.getXVelocity(mVelocityTracker, 
         pointerId)); 
       Log.d("", "Y velocity: " + 
         VelocityTrackerCompat.getYVelocity(mVelocityTracker, 
         pointerId)); 
       break; 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_CANCEL: 
       // Return a VelocityTracker object back to be re-used by others. 
       mVelocityTracker.recycle(); 
       break; 
     } 
     return true; 
    } 
+0

Можете ли вы помочь в объединении этого кода с моим существующим кодом? – jason

0

изменение

public boolean onTouchEvent(MotionEvent ev) { 
    SGD.onTouchEvent(ev); 
    return true; 
} 

в

public boolean onTouchEvent(MotionEvent ev) { 
    switch(ev.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN, case MotionEvent.ACTION_UP: 
      SGD.onTouchEvent(ev); 
      break; 
    return true; 
} 
Смежные вопросы