7
votes

Comment Travailleur fonctionne dans la toile Android

Je veux dessiner un bitmap sur un rectangle. J'utilise les valeurs ci-dessous:

public void onDraw(Canvas canvas){
    //canvas.drawBitmap(bitmap, 20,20, null);
    Paint paint = new Paint();
    paint.setColor(Color.BLUE);
    canvas.drawLine(this.points[0].x, this.points[0].y, this.points[1].x, this.points[1].y, paint);
    canvas.drawLine(this.points[1].x, this.points[1].y, this.points[3].x, this.points[3].y, paint);
    canvas.drawLine(this.points[3].x, this.points[3].y, this.points[2].x, this.points[2].y, paint);
    canvas.drawLine(this.points[2].x, this.points[2].y, this.points[0].x, this.points[0].y, paint);
    canvas.drawBitmapMesh(this.bitmap, meshWidth, meshHeight, verts, 0, null, 0, null);
}


1 commentaires

Cette réponse est liée: Stackoverflow.com/a/42962558/897007


4 Réponses :


2
votes

Si tout ce que vous faites, c'est dessiner un rectangle, vous n'avez pas besoin d'utiliser un maillage du tout. Il sera plus coûteux d'utiliser le maillage.


1 commentaires

Je sais mais je veux comprendre comment la logique derrière la méthode.



1
votes

Vous n'initialisez pas les verts dans le code ci-dessus. Il devrait faire ce que vous voulez si vous attribuez réellement des valeurs aux éléments de verts (cependant, comme l'a dit Romain, ce n'est pas le meilleur moyen d'accomplir la tâche).


0 commentaires

10
votes

Tout ce dont vous avez besoin pour comprendre la fonction DrawbitMapMesh peut être trouvé dans la documentation du développeur Android. Voir Documentation de développeur Android . Cependant, je vais l'expliquer ici dans mes propres mots. La syntaxe de la fonction est la suivante: xxx

Le bitmap est clairement le bitmap que vous souhaitez utiliser. Maintenant, imaginez une grille sur le bitmap avec un wwidth + 1 points le long des lignes de l'image et de la meshheight + 1 point dans les colonnes du bitmap. Vous spécifiez ces points ou sommets, dans la variable Verts. Celles-ci sont entrées dans le format majeur de la ligne, ce qui signifie que vous entrez les sommets en vert de gauche à droite pour la ligne 1, puis de gauche à droite pour la rangée 2, etc., c'est-à-dire si nous avons 4 x 4 points, puis nous avons quelque chose comme ceci:

* 01 * 02 * 03 * 04

* 05 * 06 * 07 * 08

* 09 * 10 * 11 * 12

* 13 * 14 * 15 * 16

où * n est un sommet (x, y) avec des coordonnées posées correctement sur l'image bitmap. Vous définissez votre tableau de Vert comme suit: xxx

Si vous deviez distribuer ces points uniformément sur le bitmap, le trachbitmapmesh serait en théorie donnerait la même sortie que la fonction de traction. Cependant, si vous déplacez ces sommets loin de leur position «naturelle», le tracez-mysquetsh commencera à étirer le bitmap selon la spécification.

Vous pouvez définir les arguments de fonction restants sur 0, null, 0, null, 0, null. respectivement comme vous l'avez fait dans votre exemple.


0 commentaires

1
votes
public class MainActivity extends Activity
{
    private Bitmap bitmap;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(new MyView(this, R.drawable.jinta));
    }
private class MyView extends View
    {
             private final int WIDTH = 20;
        private final int HEIGHT = 20;

        private final int COUNT = (WIDTH + 1) * (HEIGHT + 1);

        private final float[] verts = new float[COUNT * 2];

        private final float[] orig = new float[COUNT * 2];
        public MyView(Context context, int drawableId)
        {
            super(context);
            setFocusable(true);
                    bitmap = BitmapFactory.decodeResource(getResources()
                    , drawableId);
             float bitmapWidth = bitmap.getWidth();
            float bitmapHeight = bitmap.getHeight();
            int index = 0;
            for (int y = 0; y <= HEIGHT; y++)
            {
                float fy = bitmapHeight * y / HEIGHT;
                for (int x = 0; x <= WIDTH; x++)
                {
                    float fx = bitmapWidth * x / WIDTH;

                    orig[index * 2 + 0] = verts[index * 2 + 0] = fx;
                    orig[index * 2 + 1] = verts[index * 2 + 1] = fy;
                    index += 1;
                }
            }

            setBackgroundColor(Color.WHITE);
        }
        @Override
        protected void onDraw(Canvas canvas)
        {
                       canvas.drawBitmapMesh(bitmap, WIDTH, HEIGHT, verts
                    , 0, null, 0,null);
        }

        private void warp(float cx, float cy)
        {
            for (int i = 0; i < COUNT * 2; i += 2)
            {
                float dx = cx - orig[i + 0];
                float dy = cy - orig[i + 1];
                float dd = dx * dx + dy * dy;
                     float d = (float) Math.sqrt(dd);

                float pull = 100000 / ((float) (dd * d));

                if (pull >= 1)
                {
                    verts[i + 0] = cx;
                    verts[i + 1] = cy;
                }
                else
                {

                    verts[i + 0] = orig[i + 0] + dx * pull;
                    verts[i + 1] = orig[i + 1] + dy * pull;
                }
            }
                     invalidate();
        }
        @Override
        public boolean onTouchEvent(MotionEvent event)
        {
                 warp(event.getX(), event.getY());
            return true;
        }
    }
}

1 commentaires

Ce code ne fonctionne pas, alors partagez votre code complet.