2014-10-15 8 views
0

То, что я пробовал:Как обновить изменения ShapeDrawable Android после внедрения Scroller с GestureDetector?

Я рисую shapeDrawables в onDraw(Canvas canvas) с заданными пределами.

Добавлено Handle Input Gestures, которые позволяют вид на прокрутку в любом направлении, как 2D вид прокрутки, как упомянуто в этом SO post.

Проблема:

когда я прокрутки вид на onScroll() GestureDetector shapeDrawable-х оценка меняется! есть ли какой-либо метод для изменения/обновления уже отображаемых границ shapeDrawable при прокрутке?

Я реализовал onTouchEvent(MotionEvent event) так, что если я нажимаю на фигуры рисунка, отображаемые на холсте/представлении, если щелкнул x, y содержит границу формы, а затем удаляет выталкиваемый. эта вещь отлично работает, когда просмотр не прокручивается, если прокрутка рамки обзора не позволяет обнаружить формуруемую из-за изменения связанных параметров и x, y.

Код:

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Rect; 
import android.graphics.drawable.ShapeDrawable; 
import android.graphics.drawable.shapes.OvalShape; 
import android.graphics.drawable.shapes.RectShape; 
import android.graphics.drawable.shapes.Shape; 
import android.os.Build; 
import android.util.AttributeSet; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.Scroller; 

import java.util.*; 

public class ShapeDrawableView extends View { 
    private List<ShapeDrawable> shapes = new ArrayList<ShapeDrawable>(); 
    private Integer[] mColors = { Color.BLACK, Color.BLUE, Color.GREEN, 
      Color.RED }; 

    // If made programmatically and added with setContentView 

    public ShapeDrawableView(Context context) { 
     super(context); 
    } 

    private Scroller mScroller; 
    private GestureDetector mDetector; 

    public ShapeDrawableView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mDetector = new GestureDetector(ShapeDrawableView.this.getContext(), 
       new GestureListener()); 
     if (Build.VERSION.SDK_INT < 11) { 
      mScroller = new Scroller(getContext()); 
     } else { 
      mScroller = new Scroller(getContext(), null, true); 
     } 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     for (ShapeDrawable shape : shapes) { 
      shape.draw(canvas); 
     } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     mDetector.onTouchEvent(event); 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      int x = (int) event.getX(); // Use getX(int) for multi-finger 
             // gestures 
      int y = (int) event.getY(); 
      if (!isDeletingExistingShape(x, y)) { 
       shapes.add(makeShapeDrawable(x, y)); 
      } 
      invalidate(); 
      return (true); // Handled touch event 
     } else { 
      return (false); // Did not handle touch event 
     } 
    } 

    private boolean isDeletingExistingShape(int x, int y) { 
     for (ShapeDrawable shape : shapes) { 
      Rect bounds = shape.getBounds(); 
      if (bounds.contains(x, y)) { 
       shapes.remove(shape); 
       return (true); 
      } 
     } 
     return (false); 
    } 

    private ShapeDrawable makeShapeDrawable(int x, int y) { 
     int maxWidth = getWidth()/10; 
     int maxHeight = getHeight()/10; 
     Shape shape; 
     if (Math.random() < 0.5) { 
      shape = new OvalShape(); 
     } else { 
      shape = new RectShape(); 
     } 
     ShapeDrawable shapeD = new ShapeDrawable(shape); 
     int width = RandomUtils.randomInt(maxWidth) + 5; 
     int height = RandomUtils.randomInt(maxHeight) + 5; 
     shapeD.setBounds(x - width/2, y - height/2, x + width/2, y 
       + height/2); 
     shapeD.getPaint().setColor(RandomUtils.randomElement(mColors)); 

     return (shapeD); 
    } 

    private class GestureListener extends 
      GestureDetector.SimpleOnGestureListener { 
     @Override 
     public boolean onScroll(MotionEvent e1, MotionEvent e2, 
       float distanceX, float distanceY) { 
      // Set the pie rotation directly. 
      // float scrollTheta = vectorToScalarScroll(
      // distanceX, 
      // distanceY, 
      // e2.getX() - mPieBounds.centerX(), 
      // e2.getY() - mPieBounds.centerY()); 
      // setPieRotation(getPieRotation() - (int) scrollTheta/
      // FLING_VELOCITY_DOWNSCALE); 

      scrollBy((int) distanceX, (int) distanceY); 

      return true; 
     } 

     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
       float velocityY) { 
      // Set up the Scroller for a fling 
      /* 
      * float scrollTheta = vectorToScalarScroll(velocityX, velocityY, 
      * e2.getX() - mPieBounds.centerX(), e2.getY() - 
      * mPieBounds.centerY()); mScroller.fling(0, (int) 
      * getPieRotation(), 0, (int) scrollTheta/
      * FLING_VELOCITY_DOWNSCALE, 0, 0, Integer.MIN_VALUE, 
      * Integer.MAX_VALUE); 
      * 
      * // Start the animator and tell it to animate for the expected 
      * duration of the fling. if (Build.VERSION.SDK_INT >= 11) { 
      * mScrollAnimator.setDuration(mScroller.getDuration()); 
      * mScrollAnimator.start(); } 
      */ 

      mScroller.fling(getScrollX(), getScrollY(), -(int) velocityX, 
        -(int) velocityY, 0, (int) 100, 0, (int) 100); 
      invalidate(); // don't remember if it's needed 
      return true; 

      // return true; 
     } 

     @Override 
     public boolean onDown(MotionEvent e) { 
      // The user is interacting with the pie, so we want to turn on 
      // acceleration 
      // so that the interaction is smooth. 
      /* 
      * mPieView.accelerate(); if (isAnimationRunning()) { 
      * stopScrolling(); } 
      */ 

      if (!mScroller.isFinished()) { // is flinging 
       mScroller.forceFinished(true); // to stop flinging on touch 
      } 
      return true; // else won't work 
      // return true; 
     } 
    } 

} 

Gist

+1

просто обновить й и у в onTouchEvent: х + = getScrollX(); y + = getScrollY(); – pskink

+0

спасибо, попробуем это .. –

+0

@pskink, пожалуйста, вставьте этот ответ, я отвечу на ваш ответ :) ваш комментарий к одной строке - правильный ответ (спасатель жизни) для меня! –

ответ

1

просто обновить й и у в onTouchEvent:

x += getScrollX(); 
y += getScrollY();