开发者

How to redraw the Android Canvas

Can anyone help me on how to redraw the canvas. I tried many examples and source code from the internet, but it still didn't work on my PC like the invalidate func, canvas.save, canvas.restore, etc. I want to do some translation and scaling for the canvas, but when I follow the step on the internet it shows nothing. This is my source code. (I'm still new to Java/Android programming.)

@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.开发者_JAVA百科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;  
}


You do not call onDraw() yourself. Instead, you call to invalidate() and it will make sure onDraw() is called as soon as the it can.

Also, if you are trying to draw on the canvas from outside the onDraw() method, you need to get a reference to the canvas.

Inside your onDraw() the canvas is not being changed. only saved (again, called on invalidate() or whenever the system needs to redraw this View):

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

}

Accessing the canvas from outside the onDraw() is done using a Holder().lockCanvas() to get reference to the canvas. After drawing, you unlock it again, using unlockAndPost() and that's it.

You will also need to implement the Callback.surfaceCreated interface to find out when the Surface is available to use.

Take a look at the android reference for SurfaceHolder.

This post explains it pretty well.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜