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