如何在画布上绘制多个位图?

时间:2014-07-28 18:24:45

标签: android canvas bitmap

我想开发一款能够在画布的每一次触摸上射击子弹的游戏。 它可以工作,但是当我在拍摄后触摸画布时,他会接受子弹并重新开始拍摄。 我只想让位图在每次触摸时创建新的子弹。这是我的代码:

public class MainActivity extends Activity implements OnTouchListener {

    DrawBall d;
    int x ;
    int y;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         d = new DrawBall(this);
        d.setOnTouchListener(this);
        setContentView(d);

    }



    public class DrawBall extends View {

        Bitmap alien;

        public DrawBall(Context context) {
            super(context);
            alien = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);

        }


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

            startDraw(canvas);

        }


        public void startDraw(Canvas canvas){
            Rect ourRect = new Rect();
            ourRect.set(0,0, canvas.getWidth(), canvas.getHeight());

            Paint blue = new Paint();
            blue.setColor(Color.BLACK);
            blue.setStyle(Paint.Style.FILL);

            canvas.drawRect(ourRect, blue);

            if(y < canvas.getHeight()){
                y-=5;
            }


            canvas.drawBitmap(alien, x, y,new Paint());

            invalidate();
        }


    }



    public boolean onTouch(View v, MotionEvent event) {

        x = (int) event.getX();
        y = (int) event.getY();



        return false;
    }



}

2 个答案:

答案 0 :(得分:0)

每次抽奖都以空白画布开始。因此,要绘制多个位图,您需要跟踪绘制每个项目符号的位置并多次调用drawBitmap。

此外,在onDraw中调用invalidate是一个坏主意 - 它会立即失效,从而导致性能问题。我建议改为使用计时器。过于频繁地绘制会导致性能问题。

答案 1 :(得分:0)

我只是表面上看过代码。您似乎只使用x y坐标跟踪一颗子弹。每次触摸事件时坐标都会重置,因此您将丢失之前的子弹。

使用动态数组或链接列表来跟踪屏幕上的所有项目符号 当有新的触摸时,将x,y添加到数组中 绘制项目符号时,遍历数组以绘制和更新每个项目符号 如果任何项目符号的y坐标离开屏幕,请从阵列中删除项目符号。