Как drawBitmapMesh работает на холсте Android - PullRequest
5 голосов
/ 06 января 2011

Я хочу нарисовать растровое изображение на прямоугольнике.Я использую следующие значения:

    this.meshWidth = 1;
    this.meshHeight = 1;
    this.verts = new float[8];
    this.points[0].x = (float)(this.getWidth()/4);
    this.points[0].y = (float)(this.getHeight()/4);
    this.points[1].x = (float)(this.points[0].x+this.getWidth()/2);
    this.points[1].y = (float)(this.points[0].y);
    this.points[2].x = (float)(this.points[0].x);
    this.points[2].y = (float)(this.points[0].y+this.getHeight()/2);
    this.points[3].x = (float)(this.points[1].x);
    this.points[3].y = (float)(this.points[2].y);

массив точек - это мой массив вершин.

мой метод onDraw

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);
}

Вывод такой alt text

Я хочу нарисовать растровое изображение на прямоугольнике, окруженном синими линиями ..

Ответы [ 4 ]

10 голосов
/ 06 ноября 2012

Все, что вам нужно для понимания функции DrawBitmapMesh, можно найти в документации для разработчиков Android.См. Документация для разработчиков Android .

Однако я объясню это здесь своими словами.Синтаксис этой функции:

public void drawBitmapMesh (Bitmap bitmap, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors, int colorOffset, Paint paint)

Растровое изображение - это, очевидно, растровое изображение, которое вы хотите использовать.Теперь представьте сетку поверх растрового изображения с meshWidth + 1 точкой вдоль строк изображения и meshHeight + 1 точкой вниз по столбцам растрового изображения.Вы указываете эти точки или вершины в переменной verts.Они вводятся в основном формате строки, то есть вы вводите вершины по вертикали слева направо для строки 1, затем слева направо для строки 2 и т. Д., Т. Е. Если у нас 4 х 4 точки, то у нас есть что-токак это:

* 01 * 02 * 03 * 04

* 05 * 06 * 07 * 08

* 09 * 10 * 11 * 12

* 13 * 14 * 15 * 16

где * n - вершина (x, y) с координатами, соответствующим образом расположенными над растровым изображением.Вы бы определили свой массив vert следующим образом:

vert[0] = (*01).x;
vert[1] = (*01).y;
vert[2] = (*02).x;
vert[3] = (*02).y;
...

Если бы вы распределили эти точки равномерно по растровому изображению, тогда drawBitmapMesh теоретически даст тот же результат, что и функция drawBitmap.Однако, если вы сместите эти вершины от их «естественной» позиции, то drawBitmapMesh начнет растягивать растровое изображение в соответствии со спецификацией.

Вы можете установить оставшиеся аргументы функции равными 0, нулю, 0, нулю соответственнокак вы сделали в своем примере.

2 голосов
/ 06 января 2011

Если все, что вы делаете, это рисуете прямоугольник, вам вообще не нужно использовать сетку. Использование сетки будет дороже.

1 голос
/ 30 декабря 2018
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 голос
/ 16 октября 2012

Вы не инициализируете вершины в коде выше.Он должен делать то, что вы хотите, если вы фактически присваиваете значения элементам verts (хотя, как сказал Ромен, это не лучший способ выполнить задачу).

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