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); }
4 Réponses :
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. P>
Je sais mais je veux comprendre comment la logique derrière la méthode.
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). P>
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: p> 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: p> * 01 * 02 * 03 * 04 p> * 05 * 06 * 07 * 08 p> * 09 * 10 * 11 * 12 p> * 13 * 14 * 15 * 16 p> 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: p> 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. P> 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. p> p>
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; } } }
Ce code ne fonctionne pas, alors partagez votre code complet.
Cette réponse est liée: Stackoverflow.com/a/42962558/897007