Question

Ce que je veux faire est de tracer une ligne qui va suivre mon doigt. J'ai créé une vue personnalisée, et j'ai un onTouchEvent() qui fonctionne.

Je peux tracer une ligne de statique dans la méthode onDraw() sans trop de peine.

Je ne suis pas vraiment sûr comment obtenir la ligne à dessiner comme mon doigt se déplace cependant.

  public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            Log.e(TAG, " - DOWN -");
            Log.e(TAG, " getX: " + event.getX());
            break;
        }
        case MotionEvent.ACTION_UP: {
            Log.e(TAG, " - UP -");
            Log.e(TAG, " getX: " + event.getX());
            break;
        }
        }
        return true;
    }

Les conseils que vous les gars qui ont fait un tout peut donner?

Dois-je besoin de coordonnées sur l'ensemble onTouchEvent() et invalident constamment la vue de sorte que les petits segments de ligne dessiner?

En fin de compte, je veux juste être en mesure de griffonner essentiellement sur l'écran à l'aide du doigt pour cette expérience.

Était-ce utile?

La solution

Vous êtes suivi que le haut et le bas des événements. Suivre l'événement ACTION_MOVE aussi. Attention qu'il continue de suivre, même si le doigt de la personne ne semble en mouvement. Votre code devrait aller quelque chose comme ceci:

ACTION_DOWN: Position magasin

.

ACTION_MOVE. Si la position est différente de la position mémorisée puis tracer une ligne de position mémorisée à la position actuelle, et la mise à jour mémorisée à la position actuelle

ACTION_UP. Arrêt

Dans le bit ACTION_MOVE, il pourrait être une bonne idée de vérifier si la position est éloignée de la position mémorisée au moins 2 ou 3 pixels. Si vous allez stocker tous les points de l'intrigue, de sorte que vous pouvez faire quelque chose avec les données plus tard, puis augmenter peut-être que 10 pixels afin de ne pas se retrouver avec des centaines de points pour une ligne simple.

Autres conseils

Voici ce que je fini par faire. Espérons que cela aide d'autres débutants là-bas pour commencer.

J'ai une classe Sprite qui représente l'objet que je veux passer à l'écran:

   public class Sprite {
    private final String TAG = "Sprite";
    private Drawable drawable;
    private int x; // the X coordinate
    private int y; // the Y coordinate
    private boolean touched; // if droid is touched/picked up
    private Speed speed; // the speed with its directions

    public Sprite(Drawable drawable, int x, int y) {
        this.drawable = drawable;
        this.x = x;
        this.y = y;
        this.speed = new Speed();
    }

    public void draw(Canvas canvas) {
        drawable.setBounds(new Rect(x, y, x+drawable.getIntrinsicWidth(), y+drawable.getIntrinsicHeight()));
        drawable.draw(canvas);
    }

    public void move() {
        if (!touched) {
            x += (speed.getXv() * speed.getxDirection());
            y += (speed.getYv() * speed.getyDirection());
        }
    }

    public void handleActionDown(int eventX, int eventY) {
        if (eventX >= (x - bitmap.getWidth() / 2) && (eventX <= (x + bitmap.getWidth() / 2))) {
            if (eventY >= (y - bitmap.getHeight() / 2) && (y <= (y + bitmap.getHeight() / 2))) {
                // droid touched
                setTouched(true);
            } else {
                setTouched(false);
            }
        } else {
            setTouched(false);
        }
    }
}

Alors j'ai une boucle de jeu principal. Cette boucle emprisonnant et appelle mes méthodes et rendre la mise à jour de mainPanel qui ressemble à ceci:

    public void render(Canvas canvas) {
    canvas.drawColor(Color.BLACK);
    sprite.draw(canvas);
}

public void update() {
    sprite.move();
}

La position de l'endroit où l'image-objet est traité déplacer dans la capture d'événement de mouvement:

        if (event.getAction() == MotionEvent.ACTION_MOVE) {
        // the gestures
        if (sprite.isTouched()) {
            sprite.setX((int) event.getX());
            sprite.setY((int) event.getY());
        }
    }

Il faut espérer que est utile. Si je parés trop bien et il y a quelque chose que vous ne soyez pas me le faire savoir.

L'étape suivante, faisant l'objet de suivre la ligne!

Un événement tactile est associé à une liste de comptes de pointeur RÉCUPÉRABLE comme suit:

     int p = event.getPointerCount();

itérer sur ces derniers et des points de dessin peut provoquer un continu ligne apparaisse

if (event.getAction() == MotionEvent.ACTION_MOVE
    || event.getAction() == MotionEvent.ACTION_DOWN) {

  int p = event.getPointerCount();
     for (int i = 0; i < p; i++) { 
       c.drawPoint(event.getX(i), event.getY(i), paint);
     }
}

En supposant paint est déjà défini et c est la toile, qui peut devoir être verrouillé (EG- dans une application multithread), avant de tirer dessus.

Pour les débutants ce code vous aidera à créer l'image doodle et l'exporter dans l'image .png Voici le Complete CODE et ce de la classe Activité Avec contient une classe View trop ..

public class MainActivity extends Activity {
    private Bitmap DrawBitmap;
    private Canvas mCanvas;
    private Path mPath;
    private Paint DrawBitmapPaint;
    RelativeLayout Rl;
    CustomView View;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        View = new CustomView(this);
        Rl = (RelativeLayout) findViewById(R.id.Rel);
        Rl.addView(View);
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(getResources()
                .getColor(android.R.color.holo_green_dark));
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(20);

    }

    private Paint mPaint;

    public class CustomView extends View {

        @SuppressWarnings("deprecation")
        public CustomView(Context c) {

            super(c);
            Display Disp = getWindowManager().getDefaultDisplay();
            DrawBitmap = Bitmap.createBitmap(Disp.getWidth(), Disp.getHeight(),
                    Bitmap.Config.ARGB_4444);

            mCanvas = new Canvas(DrawBitmap);

            mPath = new Path();
            DrawBitmapPaint = 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) {
            setDrawingCacheEnabled(true);
            canvas.drawBitmap(DrawBitmap, 0, 0, DrawBitmapPaint);
            canvas.drawPath(mPath, mPaint);
            canvas.drawRect(mY, 0, mY, 0, DrawBitmapPaint);
        }

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

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

        private void touch_move(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 touch_up() {
            mPath.lineTo(mX, mY);

            mCanvas.drawPath(mPath, mPaint);

            mPath.reset();
        }

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

            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                touch_start(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_MOVE:
                touch_move(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                touch_up();
                invalidate();
                break;
            }
            return true;
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        mPaint.setXfermode(null);
        switch (item.getItemId()) {
        case R.id.erase: 
               mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
               break;
        case R.id.DELETE: 
             View =  new CustomView(this);
               break;
        case R.id.draw: 
               mPaint.setXfermode(null);

               break;
        case R.id.Save:
            String pattern = "mm ss";
            SimpleDateFormat formatter = new SimpleDateFormat(pattern);
            String time = formatter.format(new Date());
            String path = ("/d-codepages" + time + ".png");

            File file = new File(Environment.getExternalStorageDirectory()
                    + path);

            try {
                DrawBitmap.compress(Bitmap.CompressFormat.PNG, 100,
                        new FileOutputStream(file));
                Toast.makeText(this, "File Saved ::" + path, Toast.LENGTH_SHORT)
                        .show();
            } catch (Exception e) {
                Toast.makeText(this, "ERROR" + e.toString(), Toast.LENGTH_SHORT)
                        .show();
            }

        }
        return super.onOptionsItemSelected(item);
    }

}

Consultez également la classe Java Path. Vous pouvez l'utiliser pour dessiner chemin ... que vous vous déplacez votre doigt sur l'écran. avec chaque mise à jour (cependant vous mettre en œuvre cette - tous tant de pixels de la dernière mise à jour par exemple) vous ajoutez la coordonnées x, y à votre chemin et réengendrer la course totale à travers une boucle. juste une idée que je jouais avec maintenant.

Son été un certain temps, mais ce poste obtient encore des points de vue, donc je pensais que je posterai quelques trucs utiles:

Tutoriel sur la façon de faire un objet de suivre une ligne: http://www.rengelbert.com/tutorial.php?id=182

Ceci est un bon moteur de jeu gratuit que les utilisations tutoriel ci-dessus aussi: http://libgdx.badlogicgames.com/

Espérons que cela aide quelqu'un!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top