Нужно ли использовать недействительный вызов, и если да, то где? - PullRequest
2 голосов
/ 03 августа 2011

У меня есть действие, которое показывает вид, в нем есть холст, который рисуется, затем у меня есть функция касания, которая позволяет перетаскивать холст.Однако при отладке он работает нормально, за исключением случаев, когда холст не перемещается.Я думаю, что мне нужно назвать недействительным, это правильно?если да, то где мне это назвать?

Спасибо за любую помощь, которую вы можете мне оказать.

Touch.java

package org.example.touch;

import android.app.Activity;
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class Touch extends Activity implements OnTouchListener {
   private static final String TAG = "Touch";
   // These matrices will be used to move and zoom image
   Matrix matrix = new Matrix();
   Matrix savedMatrix = new Matrix();

   // We can be in one of these 3 states
   static final int NONE = 0;
   static final int DRAG = 1;
   static final int ZOOM = 2;
   int mode = NONE;

   // Remember some things for zooming
   PointF start = new PointF();
   PointF mid = new PointF();
   float oldDist = 1f;

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      GridView view = new GridView(this);
      setContentView(view);
      // ImageView view = (ImageView) findViewById(R.id.imageView);
      view.setOnTouchListener(this);

      // ...
      // Work around a Cupcake bug
      matrix.setTranslate(1f, 1f);
      view.setImageMatrix(matrix);

   }

   @Override
   public boolean onTouch(View v, MotionEvent rawEvent) {
      WrapMotionEvent event = WrapMotionEvent.wrap(rawEvent);
      // ...
      GridView view = (GridView) v;

      // Dump touch event to log
      dumpEvent(event);

      // Handle touch events here...
      switch (event.getAction() & MotionEvent.ACTION_MASK) {
      case MotionEvent.ACTION_DOWN:
         savedMatrix.set(matrix);
         start.set(event.getX(), event.getY());
         Log.d(TAG, "mode=DRAG");
         mode = DRAG;
         break;
      case MotionEvent.ACTION_POINTER_DOWN:
         oldDist = spacing(event);
         Log.d(TAG, "oldDist=" + oldDist);
         if (oldDist > 10f) {
            savedMatrix.set(matrix);
            midPoint(mid, event);
            mode = ZOOM;
            Log.d(TAG, "mode=ZOOM");
         }
         break;
      case MotionEvent.ACTION_UP:
      case MotionEvent.ACTION_POINTER_UP:
         mode = NONE;
         Log.d(TAG, "mode=NONE");
         break;
      case MotionEvent.ACTION_MOVE:
         if (mode == DRAG) {

            matrix.set(savedMatrix);
            matrix.postTranslate(event.getX() - start.x,
                  event.getY() - start.y);
         }
         else if (mode == ZOOM) {
            float newDist = spacing(event);
            Log.d(TAG, "newDist=" + newDist);
            if (newDist > 10f) {
               matrix.set(savedMatrix);
               float scale = newDist / oldDist;
               matrix.postScale(scale, scale, mid.x, mid.y);
            }
         }
         break;
      }

      view.setImageMatrix(matrix);
      return true; // indicate event was handled
   }

   /** Show an event in the LogCat view, for debugging */
   private void dumpEvent(WrapMotionEvent event) {
      // ...
      String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",
            "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
      StringBuilder sb = new StringBuilder();
      int action = event.getAction();
      int actionCode = action & MotionEvent.ACTION_MASK;
      sb.append("event ACTION_").append(names[actionCode]);
      if (actionCode == MotionEvent.ACTION_POINTER_DOWN
            || actionCode == MotionEvent.ACTION_POINTER_UP) {
         sb.append("(pid ").append(
               action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
         sb.append(")");
      }
      sb.append("[");
      for (int i = 0; i < event.getPointerCount(); i++) {
         sb.append("#").append(i);
         sb.append("(pid ").append(event.getPointerId(i));
         sb.append(")=").append((int) event.getX(i));
         sb.append(",").append((int) event.getY(i));
         if (i + 1 < event.getPointerCount())
            sb.append(";");
      }
      sb.append("]");
      Log.d(TAG, sb.toString());
   }

   /** Determine the space between the first two fingers */
   private float spacing(WrapMotionEvent event) {
      // ...
      float x = event.getX(0) - event.getX(1);
      float y = event.getY(0) - event.getY(1);
      return FloatMath.sqrt(x * x + y * y);
   }

   /** Calculate the mid point of the first two fingers */
   private void midPoint(PointF point, WrapMotionEvent event) {
      // ...
      float x = event.getX(0) + event.getX(1);
      float y = event.getY(0) + event.getY(1);
      point.set(x / 2, y / 2);
   }
}

и представление GridView.java

package org.example.touch;

import android.app.Activity;
import android.os.Bundle;

import android.view.View;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.view.Display;
import android.graphics.Path;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.Bitmap.Config;
import android.widget.ImageView;


public class GridView extends ImageView {

    private int canvasWidth;
    private int canvasHeight;

    // private Config config;
    // private Bitmap bitmap;
    // private Canvas canvas;

    public GridView(Context context) {
        super(context);




    // config = Bitmap.Config.ARGB_8888;
    // bitmap = Bitmap.createBitmap(canvasWidth, canvasHeight, config);
    // canvas = new Canvas(bitmap);

    }


public void onDraw(Canvas canvas){
    super.onDraw(canvas);

    canvasWidth = canvas.getWidth();
    canvasHeight = canvas.getHeight();

    Paint paint = new Paint();
    paint.setStyle(Paint.Style.FILL);

    paint.setColor(Color.WHITE);
    canvas.drawPaint(paint);


    canvas.drawRect(0, 0, (float)canvasWidth, (float)canvasHeight, paint);

    int Grid_size = canvasWidth / 32;


    paint.setStyle(Style.STROKE);
        paint.setColor(Color.RED);
        for (int i = 1; i < 100; i++) {                  
                canvas.drawLine((Grid_size*i), 10, (Grid_size*i), 10+(Grid_size*10), paint);              
               }                  
        paint.setColor(Color.RED);
            for (int i = 1; i < 12; i++) {                                  
                    canvas.drawLine(10, (Grid_size*i), (Grid_size*99), (Grid_size*i), paint); 
            }
            final int FS= 500;                  //Sampling Frequency
            final int WIN=FS*20; 

            //create a test sine wave
            short[]wave = new short[WIN];
            int frequency = 1;
            int amplitude = 40;
            for (int n=0; n<WIN; n++)
                wave[n] = (short) (60.0+amplitude*Math.sin(6.282*frequency*n/FS));

            //To display the waveform

            Path path2 = new Path();
            path2.moveTo(10, 60);

            for (float x2=1; x2<WIN; x2++)
                path2.lineTo(10+(3*x2/50), wave[(int) x2]);
            Paint paint3 = new Paint();
            paint3.setColor(Color.BLACK);
            paint3.setStyle(Style.STROKE);
            canvas.drawPath(path2, paint3);
}


//public void invalidate ();

public void setImageMatrix(Matrix matrix) {
    super.setImageMatrix(matrix);

}}

1 Ответ

3 голосов
/ 03 августа 2011

вызов недействителен, когда вы хотите, чтобы экран был перерисован. Если вы хотите, чтобы он постоянно обновлялся, вы можете вызвать его в конце этапа onDraw, и он будет рисовать его снова и снова.

Если вам нужно перерисовать экран только после увеличения, сделайте это после завершения функции увеличения

...