如何将对象绘制到来自另一个类的画布?

时间:2013-03-28 20:49:51

标签: android multithreading android-canvas surfaceview

我正在尝试创建一个程序,当我触摸设备的屏幕时,一个球将会出来并将动画。我把图像放在一个单独的类中,因为稍后我会需要这个MyImage类的多个实例,因此每当我触摸屏幕时,另一个球就会出现。

我有MyImage类,其中包含一个图像。此类扩展为View类。覆盖方法onDraw是动画图像的位置(在屏幕上弹跳)。

public class MyImage extends View {
Bitmap g;
float posY = 0;
float posX = 0;

boolean ud = true, lr = true;

public MyImage(Context context) {
    super(context);
    g = BitmapFactory.decodeResource(getResources(), R.drawable.ba);
}
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawColor(Color.WHITE);
    canvas.drawBitmap(g, posX, posY, null);

    ...... //code for animating


    invalidate();
}
}

我想创建一个这个类的对象,以便从MainActivity类动画到我的其他画布。

public class MainActivity extends Activity implements OnTouchListener{
..... //declarations

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

    mySurfaceView = new MySurfaceView(this);
    mySurfaceView.setOnTouchListener(this);
    setContentView(mySurfaceView);
}

@Override
protected void onPause() {
    ....
}
@Override
protected void onResume() {
    ....
}

 Thread myThread;   
 Canvas canvas;

 public class MySurfaceView extends SurfaceView implements Runnable{
    SurfaceHolder myHolder;
    boolean isRunnable = false;

    public MySurfaceView(Context context) {
        super(context);
        myHolder = getHolder();
    }
    public void pause(){
        ....
    }

    public void resume(){
        isRunnable = true;
        myThread = new Thread(this);
        myThread.start();
    }

    @Override
    public void run() {
        while(isRunnable){
            if(!myHolder.getSurface().isValid()){
                continue;
            }
            canvas = myHolder.lockCanvas();
            canvas.drawRGB(100, 0, 0);

            myHolder.unlockCanvasAndPost(canvas);
        }
    }
}

@Override
public boolean onTouch(View v, MotionEvent me) {
    .....

    switch(me.getAction()){
    case MotionEvent.ACTION_DOWN:
        break;
    case MotionEvent.ACTION_UP:
        mi = new MyImage(this);

        canvas.drawBitmap(..) ;//Is it possible to convert object to Bitmap?

        break;
    }
    return true;
}
}

问题是我不知道如何将MyImage的对象创建为Bitmap,以便我可以将它绘制到画布中。而且我也不确定我所做的是对的,因为在我的MyImage类中我已经有了一个画布,我认为它将覆盖主要活动的画布。 任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

是的,我可能会改变这种方法。为每个球创建一个视图没有多大意义。我会创建一个自定义视图。然后,此视图可以包含球列表。在该视图的onDraw()方法中,您可以绘制所有球。球可以只是PointPointF个对象,在开头有一个默认半径。

中的某些内容
private class MyView extends View {
    List<Point> balls;

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        for(Point p : balls){
            canvas.drawCircle(p.x, p.y, 10, myPaint);
        }
    }
}