ouhz_rM 2016-06-15 13:19 采纳率: 0%
浏览 1570
已结题

做个打小飞机游戏的bug,关于图片移动的问题,有时候移动图片移动多次会卡死,不动了,如何解决?

public class PlaneView extends View {

public float currentX;
public float currentY;
private final Bitmap mBitmap_plane;

public PlaneView(Context context) {
    super(context);
    //将图片转换成Bitmap形式
    mBitmap_plane = BitmapFactory.decodeResource(context.getResources(), R.drawable.plane);
    //设置焦点
    setFocusable(true);
}

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

    //创建画笔
    Paint p = new Paint();

    //在画布上画一张图片
    canvas.drawBitmap(mBitmap_plane,currentX,currentY,p);
}

}

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

private int speed = 10;
private PlaneView mPv;
private myOnKeyListener listener = null;
private ImageView mImageView;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    getSupportActionBar().hide();
    //全屏显示

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    mPv = new PlaneView(this);
    setContentView(mPv);

    mPv.setBackgroundResource(R.color.colorPrimary);

    //获取窗口管理器
    WindowManager windowManager = getWindowManager();
    Display defaultDisplay = windowManager.getDefaultDisplay();
    DisplayMetrics metrics = new DisplayMetrics();

    //获取屏幕的宽高
    defaultDisplay.getMetrics(metrics);

    //设置飞机的初始位置
    mPv.currentX = metrics.widthPixels / 2;
    mPv.currentY = metrics.heightPixels - 40;
    mPv.setOnKeyListener(listener == null ? new myOnKeyListener() : listener);
}


class myOnKeyListener implements View.OnKeyListener {

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        switch (event.getKeyCode()) {
            case KeyEvent.KEYCODE_S:
                mPv.currentY += speed;
                break;

            case KeyEvent.KEYCODE_W:
                mPv.currentY -= speed;
                break;

            case KeyEvent.KEYCODE_A:
                mPv.currentX -= speed;
                break;

            case KeyEvent.KEYCODE_D:
                mPv.currentX += speed;
                break;
        }
        mPv.invalidate();
        return true;
    }
}

}

当移动多次就卡死不动了,LogCat也没有打印日志,我的开发环境是AS2.1

  • 写回答

2条回答

  • 练小芽 2016-06-16 02:25
    关注

    我觉得可能有两个原因,一个是可能你给的图片有点大,无论是绘制什么的有点慢,另一个我觉得你不该Paint p = new Paint();放在onDraw()里边,频繁得创建对象和回收对象是很耗内存的,gc回收时运行在主线程,一旦时间过长就会造成很大的卡顿

    评论

报告相同问题?

悬赏问题

  • ¥15 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题