2011-08-09 5 views
0

Может ли кто-нибудь помочь мне в том, как перерисовать холст. Я пробовал много примеров и исходный код из Интернета, но он по-прежнему не работал на моем компьютере, как invalidate func, canvas.save, canvas.restore и т. Д. Я хочу сделать некоторый перевод и масштабирование для холста, но когда Я следую шагу в Интернете, он ничего не показывает. Это мой исходный код. (Я все еще новичок в программировании на Java/Android.)Как перерисовать холст Android

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    drawMaps.j=1; 
    resources = this.getResources(); 
    try { 
     GetAttributes("path"); 
     } catch (XmlPullParserException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     SeekBar seekBar = (SeekBar)findViewById(R.id.seekBar1); 
     panel = new Panel(this); 
     setContentView(R.layout.main); 
     panel.onDraw(canvas2); 
     ImageView image = (ImageView) findViewById(R.id.mapImage); 
      image.setImageBitmap(bufMaps); 
} 


class Panel extends View{ 
    Paint paint = new Paint(); 
    public Panel(Context context) { 
     super(context); 
     setFocusable(true); 
    } 


    public Bitmap quicky_XY(Bitmap bitmap,int pos_x,int pos_y){ 
     Bitmap bufMap = Bitmap.createBitmap(bitmap.getWidth(), 
     bitmap.getHeight(), Config.ARGB_8888); 
     Canvas canvas = new Canvas(bufMap); 
     canvas.save(); 
      final Paint paint = new Paint(); 
      width = canvas.getWidth();//start 
      height = canvas.getHeight();//end 
      drawMaps.xpos = width/30; 
      drawMaps.ypos = height/ 20; 

      paint.setStrokeWidth(0); 
      for (int i = 0; i < 30; i++) { 
       paint.setColor(Color.DKGRAY); 
       canvas.drawLine(drawMaps.xpos +(drawMaps.xpos*i), 0, 
        drawMaps.xpos +(drawMaps.xpos*i), height, paint); 
      //canvas.drawLine(startX, startY, stopX, stopY, paint) 
      } 
      for (int i = 0; i < 20; i++) { 
       paint.setColor(Color.DKGRAY); 
       canvas.drawLine(0, drawMaps.ypos+(drawMaps.ypos*i), 
        width, drawMaps.ypos+(drawMaps.ypos*i), paint); 
      } 

      canvas.translate(pos_x,pos_y); 
      drawMaps.addPath(canvas); 
      canvas.restore(); 
      invalidate(); 
     return bufMap; 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     canvas.save(); 
     bufMaps = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888); 
     bufMaps = quicky_XY(emptyBmap,positionX,positionY); 

    } 

} 

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
positionX = (int)event.getRawX(); 
positionY = (int)event.getRawY(); 
switch(event.getAction()) 
     { 
     case MotionEvent.ACTION_DOWN: { 
      prevX = positionX; 
      prevY = positionY; 
     } 
     break; 
     case MotionEvent.ACTION_MOVE: { 
      final int distY = Math.abs(positionY - prevY); 
      final int distX = Math.abs(positionX - prevX);  
      if (distX > mTouchSlop || distY > mTouchSlop){ 
       panel.getDrawingCache(); 
       panel.invalidate(); 
      } 
       Log.e("LSDEBUG", "touch X, " + positionX); 
     }  
     break; 
     } 
return true; 
} 

ответ

1

Вы не вызываете onDraw() самостоятельно. Вместо этого вы вызываете invalidate(), и он убеждается, что onDraw() вызывается, как только он сможет.

Кроме того, если вы пытаетесь рисовать на холсте вне метода onDraw(), вам нужно получить ссылку на холст.

Внутри вашего onDraw() холст не изменяется. сохраняются только (опять же, призвал Invalidate() или когда система должна перерисовывать этот взгляд):.

@Override 
public void onDraw(Canvas canvas) { 
    canvas.save(); 
    bufMaps = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888); 
    bufMaps = quicky_XY(emptyBmap,positionX,positionY); 

} 

Доступ к холст из-за OnDraw() осуществляется с помощью держателя() lockCanvas(), чтобы получить ссылка на холст. После рисования вы разблокируете его снова, используя unlockAndPost(), и все.

Вам также необходимо реализовать интерфейс Callback.surfaceCreated, чтобы узнать, когда поверхность доступна для использования.

Посмотрите на android reference for SurfaceHolder.

This post explains it довольно хорошо.

Смежные вопросы