canvas.drawLine() не отображается на растровом изображении

Я перепробовал так много методов, но мой код отказывается просто рисовать линию на холсте. Каждая из попыток, которые я прокомментировал, либо приводит к сбою программы, либо не отображает строку. Я действительно изо всех сил пытаюсь понять, как это сделать, я продолжаю получать разные советы по использованию потоков, onDraw или чего-то еще, но ни один из них не работает.

Моя общая цель - показать растровое изображение на экране и нарисовать линии поверх него. Затем я хочу использовать canvas.tranlate, чтобы сделать все изображение (растровое изображение вместе со строками сверху) панорамируемым. (Я уже реализовал функциональность для успешного панорамирования изображения.)

public class Main extends Activity implements OnTouchListener {
CanvasView myCanvas;
Canvas canvas;
Bitmap bmp;
float fingerPosX = 0;
float fingerPosY = 0;
float preFingerPosX = 0;
float preFingerPosY = 0;
float bmpX = 0;
float bmpY = 0;
float dx = 0;
float dy = 0;
Paint paint;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    bmp = BitmapFactory.decodeResource(getResources(), R.drawable.gmit2013mod);
    canvas = new Canvas();
    myCanvas = new CanvasView(this);
    myCanvas.setOnTouchListener(this);
    setContentView(myCanvas);

}

@Override
public void onPause() {
    super.onPause();
    myCanvas.pause();
}

@Override
public void onResume() {
    super.onResume();
    myCanvas.resume();
}

public boolean onTouch(View v, MotionEvent event) {
    int action = event.getAction();
    if(action == event.ACTION_DOWN) {       //when touch is received get finger position
        preFingerPosX = event.getX();   
        preFingerPosY = event.getY();
    }

    if(action == event.ACTION_UP) {         //when touch is released get finger position
        fingerPosX = event.getX();
        fingerPosY = event.getY();
        dx = fingerPosX - preFingerPosX;    //subtract previous finger position from current
        dy = fingerPosY - preFingerPosY;
        bmpX += dx;                         //apply difference to image
        bmpY += dy;
    }
    //CanvasView.updateMap();
    //invalidate();

    return true;
}

//CanvasView Class
public class CanvasView extends SurfaceView implements Runnable{ //implements Runnable
    SurfaceHolder surfaceHolder;
    Thread myThread = null;
    boolean isRunning = false;

    public CanvasView(Context context) {
        super(context);
        surfaceHolder = getHolder();
    } 

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    //  canvas.drawBitmap(bmp, 0, 0, null);
        //canvas = surfaceHolder.lockCanvas();
        canvas.drawLine(10, 10, 30, 30, paint);
        //surfaceHolder.unlockCanvasAndPost(canvas);
    }

    public void pause() {
        isRunning = false;
        while(true) {
            try {
                myThread.join();
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            break;
        }
        myThread = null;
    }

    public void resume() {
        isRunning = true;
        myThread = new Thread(this);
        myThread.start();
    }

    public void run() {
        while(isRunning) {
            //init(); //crashes when code here
            if(!surfaceHolder.getSurface().isValid()) {
                continue;
            }
            invalidate();
            //init();
            //canvas.translate(bmpX, bmpY);
            updateMap();
            //invalidate();
        }
    }

    //  canvas = surfaceHolder.lockCanvas();
    //  canvas.drawRGB(255, 255, 255);
    //  canvas.drawBitmap(bmp, 0-(bmp.getWidth()/2), 0-(bmp.getHeight()/2), null);
    //  surfaceHolder.unlockCanvasAndPost(canvas);
    }

    public void updateMap() {
        runOnUiThread(new Runnable () {

            public void run() {
                // TODO Auto-generated method stub
                //canvas = surfaceHolder.lockCanvas();
                //canvas.drawRGB(255, 255, 255);
                //canvas.drawBitmap(bmp, bmpX-(bmp.getWidth()/2), bmpY-(bmp.getHeight()/2), null);
                //paint.setColor(Color.RED);
                //canvas.drawLine(10, 10, 30, 30, paint);   //it seems this must b in ondraw. try canvas(bmp) again, mite have some affect with different bmp
                //invalidate();
                //surfaceHolder.unlockCanvasAndPost(canvas);

            }

        });
    }
}

Вот мой код, если вы можете предложить мне какое-либо решение или какой-нибудь пример того, что это уже работает онлайн, я был бы благодарен, потому что у меня заканчивается время на этом проекте! Спасибо

ОБНОВЛЕНИЕ: я добавил следующие строки кода в метод onCreate:

Drawable drawBmp = new BitmapDrawable(bmp);
drawBmp.draw(canvas);

2 ответа

Решение

Мне нужно было добавить paint = new Paint() в onCreate. Объект рисования был null вот почему это не будет рисовать. Мне потребовались недели и нелепое количество приставаний, чтобы заметить это! Я собираюсь в отпуск...

Если кто-то планирует создать такой проект, то в ближайшем будущем я собираюсь сделать несколько видеоуроков на YouTube, чтобы помочь кому-либо попасть в те же глупые ловушки, что и я!

Большое спасибо user_CC за все его время и помощь по этому вопросу!

Вам нужно создать растровое изображение как объект Drawble, а затем нарисовать его, а не на холсте.

Таким образом, в основном вы создаете объект BitmapDrawable с помощью объекта Bitmap, который вы создали с помощью опции BitmapFactory. Вам нужно будет использовать метод draw(Canvas c) этого класса Drawable для рисования на растровом изображении.

http://developer.android.com/reference/android/graphics/drawable/BitmapDrawable.html

Другие вопросы по тегам