画布动画画圈

时间:2011-12-29 07:25:30

标签: android canvas

我需要根据我的手指移动画一个圆圈,所以我写了这段代码

package com.sport;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.BlurMaskFilter;
import android.graphics.BlurMaskFilter.Blur;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

public class sport extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new TouchView(this));

    }

    class TouchView extends View {
        Bitmap bgr;
        Bitmap overlayDefault;
        Bitmap overlay;
        Paint pTouch;

        int X;
        int Y;
        Canvas c2;

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

            bgr = BitmapFactory.decodeResource(getResources(), R.drawable.new1);
            overlayDefault = BitmapFactory.decodeResource(getResources(),
                    R.drawable.original);
            overlay = BitmapFactory.decodeResource(getResources(),
                    R.drawable.new1).copy(Config.ARGB_8888, true);
            c2 = new Canvas(overlay);

            pTouch = new Paint(Paint.DEV_KERN_TEXT_FLAG);
            pTouch.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
            pTouch.setColor(Color.TRANSPARENT);
            // pTouch.setMaskFilter(new BlurMaskFilter(15, Blur.NORMAL));
            DisplayMetrics displaymetrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
            int ht = displaymetrics.heightPixels;
            int wt = displaymetrics.widthPixels;

            X = wt / 2;
            Y = 0;

        }

        @Override
        public boolean onTouchEvent(MotionEvent ev) {

            switch (ev.getAction()) {

            case MotionEvent.ACTION_DOWN: {

                X = (int) ev.getX();
                Y = (int) ev.getY();
                //invalidate();

                break;
            }

            case MotionEvent.ACTION_MOVE: {

                X = (int) ev.getX();
                Y = (int) ev.getY();
                /* Toast.makeText(getBaseContext(),"x is::"+ X,
                          Toast.LENGTH_LONG).show();
                          Toast.makeText(getBaseContext(),"Y is::"+ Y,
                         Toast.LENGTH_LONG).show();*/
                          //c2.drawCircle(X, Y, 70, pTouch);

                /*System.out.println("x is"+X);
                System.out.println("Y is"+Y);*/
                invalidate();
                break;

            }

            case MotionEvent.ACTION_UP:
                X = (int) ev.getX();
                Y = (int) ev.getY();
                /*
                 * Toast.makeText(getBaseContext(),"x is::"+ X,
                 * Toast.LENGTH_LONG).show();
                 * Toast.makeText(getBaseContext(),"Y is::"+ Y,
                 * Toast.LENGTH_LONG).show();
                 */
                //invalidate();
                break;
            case MotionEvent.ACTION_POINTER_ID_MASK :
                /*X = (int) ev.getX();
                Y = (int) ev.getY();



                invalidate();*/
                break;
            }

            return true;
        }

        @Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            DisplayMetrics displaymetrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
            int ht = displaymetrics.heightPixels;
            int wt = displaymetrics.widthPixels;
            int heightbitmap = bgr.getHeight();
            int widthbitmap = bgr.getWidth();
            int minus = wt - widthbitmap;

            // draw background
            canvas.drawBitmap(bgr, minus / 2, 0, null);
            // copy the default overlay into temporary overlay and punch a hole
            // in it
            c2.drawBitmap(overlayDefault, 360, 0, null); // exclude this line to
                                                            // show all as you
            Bitmap _scratch = BitmapFactory.decodeResource(getResources(), R.drawable.diff_6);                                              // draw

            //c2.drawBitmap(_scratch, 10, 10, pTouch);
            if(X >= 470 & X <= 522)
            {
                if(Y >= 255 & Y<= 330)
                {   
                //c2.drawRect(X, Y, 5, 5, pTouch);
                    double outer_radius = 0.5 * Math.sqrt((_scratch.getWidth()) * (_scratch.getWidth())+ (_scratch.getHeight()) * (_scratch.getHeight()));  
                 float f = (float) outer_radius;


                    c2.drawCircle(X, Y, f, pTouch);
                }

            }   


            // draw the overlay over the background
            canvas.drawBitmap(overlay, minus/2, 0, null);

        }

    }

}

问题:: 当我触摸屏幕圈时,我的手指右侧就像这样。 enter image description here但是我需要它的中心,请帮助这个

1 个答案:

答案 0 :(得分:0)

问题是因为您创建了与触摸事件中的x和y坐标相关的“叠加”,然后将其复制到背景上并带有偏移量(减号/ 2)。假设您的背景图像小于屏幕分辨率,则圆圈将始终向右移动,因此看起来圆圈位于您手指的右侧。

如果您使用与屏幕尺寸具有相同分辨率的背景图像,您将获得正确绘制的圆圈,其中心位于触摸点。