0

任何人都可以帮助我如何重绘画布。我尝试了许多来自互联网的示例和源代码,但它仍然无法在我的 PC 上运行,例如 invalidate func、canvas.save、canvas.restore 等。我想对画布进行一些平移和缩放,但是当我按照互联网上的步骤操作,它什么也没显示。这是我的源代码。(我还是 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;  
}
4

1 回答 1

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);

}

使用 Holder().lockCanvas() 从 onDraw() 外部访问画布以获取对画布的引用。绘制后,您再次解锁它,使用 unlockAndPost() 就是这样。

您还需要实现 Callback.surfaceCreated 接口以了解 Surface 何时可用。

查看 SurfaceHolder 的android 参考

这篇文章很好地解释了它。

于 2012-06-27T09:16:57.870 回答