2013-04-17 2 views
1

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

Моя общая цель - отобразить растровое изображение на экране и нарисовать линии поверх него. Затем я хочу использовать 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); 

      } 

     }); 
    } 
} 

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

UPDATE: Я добавил следующие строки кода в OnCreate метод:

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

Посмотрите на эту ссылку .... [это] [1] [1]: http://stackoverflow.com/questions/14427665/android-drawing-app-line-cannot -be-draw-on-a-bitmap-load-from-gallery – AndiM

ответ

0

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

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

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

1

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

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

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

+0

Хорошо, я думаю, я понимаю, я очень хочу попробовать! – logicalfox

+0

приятно слышать, дайте мне знать, как вы поживаете –

+0

'BitmapDrawable drawBmp; – logicalfox