Пользовательский рисунок не отображается на холсте

#android #drawing #paint

#Android #рисование #Краски

Вопрос:

У меня есть макет XML, подобный этому:

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
>

    <com.somedomain.drawings.DrawingSurface
        android:layout_width="fill_parent"
        android:layout_height="200dip"
            android:id="@ id/drawingSurface" 
            android:background="@drawable/bg2"/>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true" >

        <Button
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:text="OK"
                android:onClick="onClick"
                android:id="@ id/colorGreenBtn" />

    </LinearLayout>

</RelativeLayout>
  

Когда я пытаюсь рисовать на DrawingSurface, рисунок не отображается. Но отображается фоновое изображение холста. И когда я сохраняю его, рисунок отображается на выходе.

Когда я удалил фоновое изображение DrawingSurface и попытался нарисовать его, оно отображается.

Я хочу показать рисунок, когда пользователь рисует на холсте с фоновым изображением. Есть идеи? Большое спасибо за любую помощь! 🙂

Обновление: вот мой код рисования

 @Override
public void run() {
    Canvas canvas = null;

    while (_run){
        if(isDrawing == true){
            try{

                canvas = mSurfaceHolder.lockCanvas(null);
                if(mBitmap == null){
                    mBitmap =  Bitmap.createBitmap (1, 1, Bitmap.Config.ARGB_8888);
                }


                final Canvas c = new Canvas (mBitmap);

                c.drawColor(0, PorterDuff.Mode.CLEAR);
                canvas.drawColor(0, PorterDuff.Mode.CLEAR);
                canvas.drawColor(0x00000000);

                commandManager.executeAll(c,previewDoneHandler);
                previewPath.draw(c);

                canvas.drawBitmap (mBitmap, 0,  0,null);
            } finally {
                mSurfaceHolder.unlockCanvasAndPost(canvas);
            }


        }

    }

}
  

Комментарии:

1. Вероятно, вам нужно включить свой код, поскольку, вероятно, что-то не так с вашим кодом рисования.

2. Спасибо за ваш ответ @David Olsson, я обновил свой вопрос.

Ответ №1:

Пара вещей, которые нужно попробовать:

1) поместите ImageView перед drawSurface в XML и поместите bg в ImageView.

Я знаю, что SurfaceView отличается от другого представления, но вы могли бы попробовать.

2) Возможно, вы могли бы сначала нарисовать bg на холсте, когда начался поток рисования. canvas.drawBitmap() может быть тем, который вы хотите использовать.

Комментарии:

1. Спасибо за ваш ответ @Terence Lui, по вашему первому предложению я не могу создать прозрачный фон холста. Я искал, но не могу найти что-то подобное, или мои навыки Google не работают. У вас есть пример кода для вашего второго предложения? Вы имеете в виду, что я должен объединить изображение bg и рисунок пользователя?

2. Если я правильно понимаю, то, что вы подразумеваете под «прозрачным холстом», на самом деле является прозрачным SurfaceView. Когда я работал над SurfaceView, он должен был находиться в верхней или нижней части его «окна». Итак, если у вас ничего нет поверх SurfaceView, вы можете установить z-порядок SurfaceView в верхней части его окна. и делать что-то подобное при инициализации SurfaceView: surface(){getHolder().SetFormat(PixelFormat. ПОЛУПРОЗРАЧНЫЙ); / …}

3. Но если вы не хотите делать SurfaceView прозрачным (я думаю, вы этого не сделаете, потому что вам нужен bg SurfaceView), поэтому все, что вам нужно сделать, это нарисовать bg самостоятельно и инициализировать холст следующим образом: canvas = new Canvas (yourbgImageBitmap); так что все будет отображаться поверх растрового изображения htis. Это намного проще.