Hi. anyone knows how to zoom paint view with image correctly?

At following code, I used canvas zoom in order to zoom paint view with
image including using setImageMatrix().
But problem arised, that is entire screen became to zoom in/out but
not paint view and image only.
So If anyone knows this issue, reply plz.


PaintScreen.java

public class PaintScreen extends Activity implements
ColorPickerDialog.OnColorChangedListener{

    Context mContext;
    private Paint mPaint;
    MaskFilter  mEmboss;
    MaskFilter  mBlur;
    private ImageView mImageView;
    private LinearLayout mPaintBaseLayout;
    private FrameLayout mTouchBaseLayout;
    private PaintView mPaintView;
    private int[] mPixels;
    private Bitmap mBitmapImage;

        private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
        MultiTouchListener multiTouchLitener = new MultiTouchListener(this);

          private static final String TAG = "Touch";
           // These matrices will be used to move and zoom image
           Matrix matrix = new Matrix();
           Matrix savedMatrix = new Matrix();
      Matrix savedMatrix2 = new Matrix();

      private  int WIDTH = 0;
      private  int HEIGHT = 1;

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

           // Remember some things for zooming
           PointF start = new PointF();
           PointF mid = new PointF();
           float oldDist = 1f;
      float newDist;
      float distanceOffset = 50f;
      float minOffset = 50f;
      float maxOffset = 10000f;


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

            this.initialize();

            this.PaintSet();
        }

        private void initialize()
        {
                mPaintBaseLayout = (LinearLayout)
findViewById(R.id.paint_paint_base_layout);
                mTouchBaseLayout = (FrameLayout)
findViewById(R.id.paint_touch_base_layout);

            mContext = this;
            mPaint = new Paint();
                mPaintView = new PaintView(mContext);
                mPaintView.setBackgroundColor(Color.TRANSPARENT);
                mPaintBaseLayout.addView(mPaintView, new
LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
                mPaintBaseLayout.setBackgroundColor(Color.TRANSPARENT);

                mPaintView.setScaleType(ScaleType.MATRIX);
                mPaintView.setMPaint(mPaint);

            Intent intent = getIntent();
            Bundle itstr = intent.getExtras();
            String imagePath = itstr.getString("image_path");

        Drawable d = Drawable.createFromPath(imagePath);

        mPaintView.setBackgroundDrawable(d);

        mPaintView.setOnTouchListener(new OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                        dumpEvent(event);
                        PaintView view = (PaintView) v;

                        switch (event.getAction() & MotionEvent.ACTION_MASK) {
                        case MotionEvent.ACTION_DOWN:
                                savedMatrix.set(matrix);
                                start.set(event.getX(), event.getY());
                                break;
                        case MotionEvent.ACTION_POINTER_DOWN:
                                oldDist = spacing(event);
                                if (oldDist > 10f) {
                                        start.set(event.getX(), event.getY());
                                        savedMatrix.set(matrix);
                                        midPoint(mid, event);
                                        mode = POINT2;
                                }
                                break;
                        case MotionEvent.ACTION_UP:
                        case MotionEvent.ACTION_POINTER_UP:
                         mode = NONE;
                         distanceOffset = minOffset;
                         break;
                        case MotionEvent.ACTION_MOVE:
                                if (mode == POINT2)
                                 {
                                        newDist = spacing(event);
                                        if (newDist - oldDist > 5f
                                                        || newDist - oldDist < 
-5f) {
                                                mode = ZOOM;
                                        } else {
                                                start.set(event.getX(), 
event.getY());
                                                mode = DRAG;

                                        }
                                 } else
                         if (mode == DRAG) {
                                    matrix.set(savedMatrix);
                                    matrix.postTranslate(event.getX() - start.x,
                                          event.getY() - start.y);


                         }
                         else if (mode == ZOOM) {
                                newDist = spacing(event);
                            if (newDist > 10f) {

                                     matrix.set(savedMatrix);
                                     float scale = newDist / oldDist;
                                     matrix.postScale(scale, scale, mid.x, 
mid.y);


                            }
                         } else {

                                 view.onTouchEvent(event);
                         }
                                break;

                        }

                        matrixTurning(matrix, view);
                        view.setImageMatrix(matrix);
                        view.cMatrix(matrix);
                        return true;
                }
                });
        }

           /** Show an event in the LogCat view, for debugging */
           private static void dumpEvent(MotionEvent 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 static float spacing(MotionEvent 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 static void midPoint(PointF point, MotionEvent event) {
              float x = event.getX(0) + event.getX(1);
              float y = event.getY(0) + event.getY(1);
              point.set(x / 2, y / 2);
           }

   private  void matrixTurning(Matrix matrix, ImageView view){

                   float[] value = new float[9];
                   matrix.getValues(value);
                   float[] savedValue = new float[9];
                   savedMatrix2.getValues(savedValue);

                   // view size
                   int width = view.getWidth();
                   int height = view.getHeight();

                   //image size
                   Drawable d = view.getDrawable();
                   if(d == null) return;
                   int imageWidth = d.getIntrinsicWidth();
                   int imageHeight = d.getIntrinsicHeight();
                   int scaleWidth = (int)(imageWidth*value[0]);
                   int scaleHeight = (int)(imageHeight*value[0]);


                   if(value[2] < width - scaleWidth) value[2] = width - 
scaleWidth;
                   if(value[5] < height - scaleHeight) value[5] = height -
scaleHeight;
                   if(value[2] > 0) value[2] = 0;
                   if(value[5] > 0) value[5] = 0;

                   if(value[0] > 10 || value[4] > 10){
                           value[0] = savedValue[0];
                           value[4] = savedValue[4];
                           value[2] = savedValue[2];
                           value[5] = savedValue[5];
                   }

                   if(imageWidth > width || imageHeight > height){

                           if(scaleWidth < width && scaleHeight < height){
                                   int target = WIDTH;

                                   if(imageWidth < imageHeight) target = HEIGHT;

                                   if(target == WIDTH) value[0] = value[4] = 
(float)width/
imageWidth;
                                   if(target == HEIGHT) value[0] = value[4] = 
(float)height/
imageHeight;


                                   scaleWidth = (int)(imageWidth*value[0]);
                                   scaleHeight = (int)(imageHeight*value[4]);

                                   if(scaleWidth == width) value[0] = value[4] 
= (float)width/
imageWidth;
                                   if(scaleHeight == height) value[0] = 
value[4] = (float)height/
imageHeight;
                           }


                   }else{
                           if(value[0] < 1) value[0] = 1;
                           if(value[4] < 1) value[4] = 1;
                   }



                   scaleWidth = (int)(imageWidth*value[0]);
                   scaleHeight = (int)(imageHeight*value[4]);

                   if(scaleWidth < width){
                           value[2] = (float)width/2-(float)scaleWidth/2;
                   }
                   if(scaleHeight < height){
                           value[5] = (float)height/2-(float)scaleHeight/2;
                   }


                   matrix.setValues(value);
                   savedMatrix2.set(matrix);


           }

        public void PaintSet(){

                mPaint.setAntiAlias(true);
                mPaint.setDither(true);
                mPaint.setColor(0xFFFF0000);
                mPaint.setStyle(Paint.Style.STROKE);
                mPaint.setStrokeJoin(Paint.Join.ROUND);
                mPaint.setStrokeCap(Paint.Cap.ROUND);
                mPaint.setStrokeWidth(24);

 
getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);
        mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 0.4f,
6, 3.5f);
        mBlur = new BlurMaskFilter(24, BlurMaskFilter.Blur.NORMAL);
        }

    public void colorChanged(int color) {
        mPaint.setColor(color);
    }
}


PaintView.java

public class PaintView extends ImageView {

        private Context mContext;

    private static final float MINP = 0.25f;
    private static final float MAXP = 0.75f;

    private Bitmap  mBitmap;
    private Bitmap  testBitmap;
    private Canvas  mCanvas;
    private Canvas  tCanvas;
    private Path    mPath;
    private Paint   mBitmapPaint;

    // onDraw
    private Paint       mPaint;
    private MaskFilter  mEmboss;
    private MaskFilter  mBlur;

    // onTouch
    private float mX, mY;
    private static final float TOUCH_TOLERANCE = 4;


        public PaintView(Context context) {
                this(context, null);
                // TODO Auto-generated constructor stub
        }

        public PaintView(Context context, AttributeSet attrs) {
                super(context, attrs);
                // TODO Auto-generated constructor stub
                mContext = context;

        mBitmap = Bitmap.createBitmap(320, 480,
Bitmap.Config.ARGB_8888);
        //mCanvas = new Canvas(mBitmap);
        mPath = new Path();
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);

        }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        //canvas.drawColor(0xFFAAAAAA);
        super.onDraw(canvas);
        mCanvas = canvas;
        canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

        canvas.drawPath(mPath, mPaint);

    }

    public void setMPaint(Paint paint) {
        mPaint = paint;
    }

    private void touchStart(float x, float y) {
        mPath.reset();
        mPath.moveTo(x, y);
        mX = x;
        mY = y;
    }

    private void touchMove(float x, float y) {
        float dx = Math.abs(x - mX);
        float dy = Math.abs(y - mY);
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
            mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
            mX = x;
            mY = y;
        }
    }

    private void touchUp() {
        mPath.lineTo(mX, mY);
        // commit the path to our offscreen
        mCanvas.drawPath(mPath, mPaint);
        // kill this so we don't double draw
        mPath.reset();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();

        Log.d("PaintView", "ev ->" + event.getAction());

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                touchStart(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_MOVE:
                touchMove(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                touchUp();
                invalidate();
                break;
        }
        return true;
    }

    public void cMatrix(Matrix matrix) {
    mCanvas.setMatrix(matrix);
    }

}

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to