Canvas Motion нарисовать круг - PullRequest
0 голосов
/ 29 декабря 2011

Мне нужно нарисовать круг согласно движению моего пальца, поэтому я должен написать этот код

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 голосов
/ 29 декабря 2011

Проблема заключается в том, что вы создаете «наложение» относительно x и y, связанного с событием касания, и затем копируете его на фон со смещением (минус 2). Предполагая, что фоновое изображение меньше разрешения экрана, круг всегда будет смещаться вправо и, следовательно, будет выглядеть так, что круг находится справа от вашего пальца.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...