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 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。