如何重新绘制Android画布



谁能帮我如何重新绘制画布。我从互联网上尝试了许多例子和源代码,但它仍然无法在我的PC上运行,就像invalidate函数和canvas一样。保存,画布。恢复等。我想为画布做一些平移和缩放,但是当我按照网上的步骤操作时,它什么也没显示。这是我的源代码。(我还是Java/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;  
}

您不能自己调用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()外部访问画布是使用Holder(). lockcanvas()来获取对画布的引用。绘制完成后,使用unlockAndPost()再次解锁,就这样了。

你还需要实现Callback。surfaceCreated接口,用于查找Surface何时可用。

看一下SurfaceHolder的android参考。

最新更新