这是Activitypublic class MenuTestActivity extends Activity {
    /** Called when the activity is first created. */
TestMenuView menuview;
int action = 0;
View currentview;
    @Override
    public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE); 
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
menuview = new TestMenuView(this);
this.currentview = menuview;
this.setContentView(menuview);    }
    public boolean onKeyUp(int keyCode, KeyEvent event) {//键盘抬起
     if(keyCode == 19){//上
     action = action & 0x1F;
     }
     if(keyCode == 20){//下
     action = action & 0x2F;
     }    
     if(keyCode == 21){//左
     action = action & 0x37;
     }    
     if(keyCode == 22){//右
     action = action & 0x3B;
     }
     if(keyCode == KeyEvent.KEYCODE_ENTER){//OK
     action = action & 0x3D;
     }
     return false;
}

public boolean onKeyDown(int keyCode, KeyEvent event){//键盘按下监听
     if(keyCode == 19){//上
     action = action | 0x20;
     }
     if(keyCode == 20){//下
     action = action | 0x10;
     }
     if(keyCode == 21){//左
     action = action | 0x08;
     }
     if(keyCode == 22){//右
     action = action | 0x04;
     }
     if(keyCode == KeyEvent.KEYCODE_ENTER){//OK 
     action = action | 0x02;
     }
     return false;
}
}这是一个viewpublic class TestMenuView extends SurfaceView implements SurfaceHolder.Callback {
MenuTestActivity activity;
private TutorialThread thread;
private TestMenuThread menuthread;
    
int k = -1;

Bitmap imagea,imageb;//静止的背景图片
Bitmap background;//主菜单的背景图片

Bitmap bitmapstart1,bitmapstart2;//开始游戏button的三种形态
Bitmap bitmapgrade1,bitmapgrade2;//查看成绩button
Bitmap bitmapset1,bitmapset2;//设置button
Bitmap bitmaphelp1,bitmaphelp2;//帮助button
Bitmap bitmapabout1,bitmapabout2;//关于button
Bitmap bitmapexit1,bitmapexit2;//退出button
Paint paint; Bitmap[] bmp_array1 = new Bitmap[6];
Bitmap[] bmp_array2 = new Bitmap[6];


//构造器
public TestMenuView(MenuTestActivity activity) {
super(activity);
getHolder().addCallback(this);
this.thread = new TutorialThread(getHolder(),this);
this.menuthread = new TestMenuThread(this);
initBitmap();

}



    //初始化图片资源的方法 
public void initBitmap(){
     paint = new Paint();
     imageb = BitmapFactory.decodeResource(getResources(), R.drawable.imageb);
     imagea = BitmapFactory.decodeResource(getResources(), R.drawable.imagea);
     bitmapstart1 = BitmapFactory.decodeResource(getResources(), R.drawable.bitmapstart1);
bitmapgrade1 = BitmapFactory.decodeResource(getResources(), R.drawable.bitmapgrade1);
bitmapset1 = BitmapFactory.decodeResource(getResources(), R.drawable.bitmapset1);
bitmaphelp1 = BitmapFactory.decodeResource(getResources(), R.drawable.bitmaphelp1);
bitmapabout1 = BitmapFactory.decodeResource(getResources(), R.drawable.bitmapabout1);
bitmapexit1 = BitmapFactory.decodeResource(getResources(), R.drawable.bitmapexit1);     bitmapstart2 = BitmapFactory.decodeResource(getResources(), R.drawable.bitmapstart2);
bitmapgrade2 = BitmapFactory.decodeResource(getResources(), R.drawable.bitmapgrade2);
bitmapset2 = BitmapFactory.decodeResource(getResources(), R.drawable.bitmapset2);
bitmaphelp2 = BitmapFactory.decodeResource(getResources(), R.drawable.bitmaphelp2);
bitmapabout2 = BitmapFactory.decodeResource(getResources(), R.drawable.bitmapabout2);
bitmapexit2 = BitmapFactory.decodeResource(getResources(), R.drawable.bitmapexit2);     background = BitmapFactory.decodeResource(getResources(), R.drawable.background);
     bmp_array1[0] = bitmapstart1;
     bmp_array1[1] = bitmapgrade1;
     bmp_array1[2] = bitmapset1;
     bmp_array1[3] = bitmaphelp1;
     bmp_array1[4] = bitmapabout1;
     bmp_array1[5] = bitmapexit1;
    
     bmp_array2[0] = bitmapstart2;
     bmp_array2[1] = bitmapgrade2;
     bmp_array2[2] = bitmapset2;
     bmp_array2[3] = bitmaphelp2;
     bmp_array2[4] = bitmapabout2;
     bmp_array2[5] = bitmapexit2;
    }


 
    @Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
     k = menuthread.value;

canvas.drawBitmap(imagea, 0, 0, paint);
canvas.drawBitmap(background, 320, 0, paint);
canvas.drawBitmap(imageb, 960, 0, paint);
canvas.drawBitmap(bitmapstart1, 520, 100, paint);
canvas.drawBitmap(bitmapgrade1, 520, 180, paint);
canvas.drawBitmap(bitmapset1, 520, 260, paint);
canvas.drawBitmap(bitmaphelp1, 520, 340, paint);
canvas.drawBitmap(bitmapabout1, 520, 420, paint);
canvas.drawBitmap(bitmapexit1, 520, 500, paint);
if(k!=-1){
canvas.drawBitmap(bmp_array2[k], 520, 100+80*k, paint);
if(k==0){
canvas.drawBitmap(bmp_array2[k+1], 520, 100+80*(k+1), paint);
}
if(k==5){
canvas.drawBitmap(bmp_array2[k-1], 520, 100+80*(k-1), paint);
}
else{
canvas.drawBitmap(bmp_array2[k+1], 520, 100+80*(k+1), paint);
canvas.drawBitmap(bmp_array2[k-1], 520, 100+80*(k-1), paint);
}
}
    } @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
     // TODO Auto-generated method stub

    }    @Override
    public void surfaceCreated(SurfaceHolder holder) {
     // TODO Auto-generated method stub
     this.thread.setFlag(true);
     this.thread.start();
     this.menuthread.setFlag(true);
     this.menuthread.start();
    }    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
     // TODO Auto-generated method stub
     boolean retry = true;
     thread.setFlag(false);
      while(retry){
      try{
      thread.join();//等待线程的结束
      retry = false;
      }
      catch(InterruptedException e) {}//不断地循环,直到刷帧线程结束
      }
     }
    
class TutorialThread extends Thread{
     private int span = 100;
     private SurfaceHolder surfaceholder;
     private TestMenuView menuview;
     private boolean flag = false;
     public TutorialThread(SurfaceHolder surfaceholder,TestMenuView menuview){
     this.surfaceholder = surfaceholder;
     this.menuview = menuview;
     }
     public void setFlag(boolean flag){
     this.flag = flag;//设置标准位
     }
@Override
public void run() {
// TODO Auto-generated method stub
Canvas canvas;
while(this.flag){
canvas = null;
try{
canvas = this.surfaceholder.lockCanvas(null);
System.out.println(canvas);
synchronized (this.surfaceholder) {
menuview.onDraw(canvas);
}
}finally{
if(canvas!=null){
this.surfaceholder.unlockCanvasAndPost(canvas);
}
}
try{
Thread.sleep(span);
}catch(Exception e){
e.printStackTrace();
}
}
}
    
    }
}这是对按键的监听的线程类public class TestMenuThread extends Thread{
MenuTestActivity activity;
TestMenuView menuview;

private boolean flag = true;
private int span = 20;
int value = 0;
int act;

private boolean KEY_UP = false;
private boolean KEY_DOWN = false;
private boolean KEY_OK = false;

public TestMenuThread(TestMenuView menuview){
this.menuview = menuview;
}
public void setFlag(boolean flag){
this.flag = flag;
}
public void run(){
while(this.flag){
act = activity.action;
System.out.println(act);
if((act & 0x20)!=0){ //上
KEY_UP = true;
}else{
KEY_UP = false;
}
if((act & 0x10)!=0){ //下
KEY_DOWN = true;
}else{
KEY_DOWN = false;
}
if((act & 0x02) != 0){//OK
KEY_OK = true;
}else{
KEY_OK = false;
}

if(KEY_UP==true){//向上键被按下
value = value-1;
if(value<0){
value = 0;
}
if(KEY_OK=true){//OK键被按下
System.out.println("OK------被按下");
}
}
if(KEY_DOWN==true){//向下键被按下
value = value+1;
if(value>5){
value = 5;
}
if(KEY_OK=true){//OK键被按下
System.out.println("OK------被按下");
}
}
}

try{
Thread.sleep(span);
}
catch(Exception e){
e.printStackTrace();
}
}
}
主要功能是实现界面并对按键监听急人啊

解决方案 »

  1.   

    贴出log
    08-08 15:24:33.687: DEBUG/AndroidRuntime(465): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
    08-08 15:24:33.687: DEBUG/AndroidRuntime(465): CheckJNI is ON
    08-08 15:24:34.326: DEBUG/AndroidRuntime(465): --- registering native functions ---
    08-08 15:24:36.466: DEBUG/AndroidRuntime(465): Shutting down VM
    08-08 15:24:36.486: DEBUG/dalvikvm(465): Debugger has detached; object registry had 1 entries
    08-08 15:24:36.496: INFO/AndroidRuntime(465): NOTE: attach of thread 'Binder Thread #3' failed
    08-08 15:24:37.126: DEBUG/AndroidRuntime(473): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
    08-08 15:24:37.126: DEBUG/AndroidRuntime(473): CheckJNI is ON
    08-08 15:24:37.346: DEBUG/AndroidRuntime(473): --- registering native functions ---
    08-08 15:24:38.567: INFO/ActivityManager(42): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=ydream.wei.test/.MenuTestActivity }
    08-08 15:24:38.656: DEBUG/AndroidRuntime(473): Shutting down VM
    08-08 15:24:38.676: DEBUG/dalvikvm(473): Debugger has detached; object registry had 1 entries
    08-08 15:24:38.726: INFO/AndroidRuntime(473): NOTE: attach of thread 'Binder Thread #3' failed
    08-08 15:24:38.816: INFO/ActivityManager(42): Start proc ydream.wei.test for activity ydream.wei.test/.MenuTestActivity: pid=480 uid=10029 gids={}
    08-08 15:24:38.846: VERBOSE/WindowManager(42): Adding window Window{4403a5e8 Starting ydream.wei.test paused=false} at 2 of 6 (after Window{4403a430 com.android.launcher/com.android.launcher2.Launcher paused=false})
    08-08 15:24:40.176: VERBOSE/WindowManager(42): Rebuild removing window: Window{4403a430 com.android.launcher/com.android.launcher2.Launcher paused=false}
    08-08 15:24:40.206: VERBOSE/WindowManager(42): Rebuild removing window: Window{4403a5e8 Starting ydream.wei.test paused=false}
    08-08 15:24:40.206: VERBOSE/WindowManager(42): Re-adding window at 1: Window{4403a430 com.android.launcher/com.android.launcher2.Launcher paused=false}
    08-08 15:24:40.206: VERBOSE/WindowManager(42): Re-adding window at 2: Window{4403a5e8 Starting ydream.wei.test paused=false}
    08-08 15:24:40.796: WARN/ResourceType(480): getEntry failing because entryIndex 29 is beyond type entryCount 1
    08-08 15:24:40.867: WARN/ResourceType(480): Failure getting entry for 0x7f02001d (t=1 e=29) in package 0: 0x80000001
    08-08 15:24:40.867: WARN/ResourceType(480): getEntry failing because entryIndex 28 is beyond type entryCount 1
    08-08 15:24:40.887: WARN/ResourceType(480): Failure getting entry for 0x7f02001c (t=1 e=28) in package 0: 0x80000001
    08-08 15:24:40.887: WARN/ResourceType(480): getEntry failing because entryIndex 20 is beyond type entryCount 1
    08-08 15:24:40.916: WARN/ResourceType(480): Failure getting entry for 0x7f020014 (t=1 e=20) in package 0: 0x80000001
    08-08 15:24:40.916: WARN/ResourceType(480): getEntry failing because entryIndex 11 is beyond type entryCount 1
    08-08 15:24:40.916: WARN/ResourceType(480): Failure getting entry for 0x7f02000b (t=1 e=11) in package 0: 0x80000001
    08-08 15:24:40.937: WARN/ResourceType(480): getEntry failing because entryIndex 17 is beyond type entryCount 1
    08-08 15:24:40.937: WARN/ResourceType(480): Failure getting entry for 0x7f020011 (t=1 e=17) in package 0: 0x80000001
    08-08 15:24:40.967: WARN/ResourceType(480): getEntry failing because entryIndex 14 is beyond type entryCount 1
    08-08 15:24:40.967: WARN/ResourceType(480): Failure getting entry for 0x7f02000e (t=1 e=14) in package 0: 0x80000001
    08-08 15:24:41.036: WARN/ResourceType(480): getEntry failing because entryIndex 5 is beyond type entryCount 1
    08-08 15:24:41.036: WARN/ResourceType(480): Failure getting entry for 0x7f020005 (t=1 e=5) in package 0: 0x80000001
    08-08 15:24:41.056: WARN/ResourceType(480): getEntry failing because entryIndex 8 is beyond type entryCount 1
    08-08 15:24:41.056: WARN/ResourceType(480): Failure getting entry for 0x7f020008 (t=1 e=8) in package 0: 0x80000001
    08-08 15:24:41.066: WARN/ResourceType(480): getEntry failing because entryIndex 21 is beyond type entryCount 1
    08-08 15:24:41.066: WARN/ResourceType(480): Failure getting entry for 0x7f020015 (t=1 e=21) in package 0: 0x80000001
    08-08 15:24:41.106: WARN/ResourceType(480): getEntry failing because entryIndex 12 is beyond type entryCount 1
    08-08 15:24:41.106: WARN/ResourceType(480): Failure getting entry for 0x7f02000c (t=1 e=12) in package 0: 0x80000001
    08-08 15:24:41.106: WARN/ResourceType(480): getEntry failing because entryIndex 18 is beyond type entryCount 1
    08-08 15:24:41.106: WARN/ResourceType(480): Failure getting entry for 0x7f020012 (t=1 e=18) in package 0: 0x80000001
    08-08 15:24:41.106: WARN/ResourceType(480): getEntry failing because entryIndex 15 is beyond type entryCount 1
    08-08 15:24:41.106: WARN/ResourceType(480): Failure getting entry for 0x7f02000f (t=1 e=15) in package 0: 0x80000001
    08-08 15:24:41.106: WARN/ResourceType(480): getEntry failing because entryIndex 6 is beyond type entryCount 1
    08-08 15:24:41.116: WARN/ResourceType(480): Failure getting entry for 0x7f020006 (t=1 e=6) in package 0: 0x80000001
    08-08 15:24:41.131: WARN/ResourceType(480): getEntry failing because entryIndex 9 is beyond type entryCount 1
    08-08 15:24:41.131: WARN/ResourceType(480): Failure getting entry for 0x7f020009 (t=1 e=9) in package 0: 0x80000001
    08-08 15:24:41.727: VERBOSE/WindowManager(42): Adding window Window{43fe7790 ydream.wei.test/ydream.wei.test.MenuTestActivity paused=false} at 2 of 7 (before Window{4403a5e8 Starting ydream.wei.test paused=false})
    08-08 15:24:42.007: DEBUG/PinyinIME InputMethodService(116): onStartInput  ccontentType: 0 Restarting:false
    08-08 15:24:42.377: VERBOSE/WindowManager(42): Adding window Window{440b69d8 SurfaceView paused=false} at 2 of 8 (before Window{43fe7790 ydream.wei.test/ydream.wei.test.MenuTestActivity paused=false})
    08-08 15:24:42.526: WARN/dalvikvm(480): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
    08-08 15:24:42.787: INFO/ActivityManager(42): Displayed activity ydream.wei.test/.MenuTestActivity: 3990 ms (total 3990 ms)
    08-08 15:24:42.887: ERROR/AndroidRuntime(480): FATAL EXCEPTION: Thread-8
    08-08 15:24:42.887: ERROR/AndroidRuntime(480): java.lang.NullPointerException
    08-08 15:24:42.887: ERROR/AndroidRuntime(480):     at android.graphics.Canvas.throwIfRecycled(Canvas.java:954)
    08-08 15:24:42.887: ERROR/AndroidRuntime(480):     at android.graphics.Canvas.drawBitmap(Canvas.java:980)
    08-08 15:24:42.887: ERROR/AndroidRuntime(480):     at ydream.wei.test.TestMenuView.onDraw(TestMenuView.java:130)
    08-08 15:24:42.887: ERROR/AndroidRuntime(480):     at ydream.wei.test.TestMenuView$TutorialThread.run(TestMenuView.java:206)
    08-08 15:24:43.057: WARN/ActivityManager(42):   Force finishing activity ydream.wei.test/.MenuTestActivity
     
    还是有错误的
      

  2.   

    at ydream.wei.test.TestMenuView$TutorialThread.run(TestMenuView.java:206)空指针异常。。不过。。这个不显示行号 很蛋疼
      

  3.   

    08-08 15:24:40.796: WARN/ResourceType(480): getEntry failing because entryIndex 29 is beyond type entryCount 1
    别只看error 
    warn也很重要
      

  4.   

    08-08 15:24:42.887: ERROR/AndroidRuntime(480): java.lang.NullPointerException
    空指针!你还是debug.看看哪里报空指针吧
      

  5.   

    08-08 15:24:42.887: ERROR/AndroidRuntime(480): java.lang.NullPointerException
    空指针异常
    08-08 15:24:42.887: ERROR/AndroidRuntime(480): at ydream.wei.test.TestMenuView.onDraw(TestMenuView.java:130)130行08-08 15:24:42.887: ERROR/AndroidRuntime(480): at ydream.wei.test.TestMenuView$TutorialThread.run(TestMenuView.java:206)206行
      

  6.   

    在改动之后log
    08-09 03:05:34.132: WARN/PackageManager(60): Code path for pkg : ydream.wei.test changing from /data/app/ydream.wei.test-2.apk to /data/app/ydream.wei.test-1.apk
    08-09 03:05:34.142: WARN/PackageManager(60): Resource path for pkg : ydream.wei.test changing from /data/app/ydream.wei.test-2.apk to /data/app/ydream.wei.test-1.apk
    08-09 03:05:36.032: WARN/ResourceType(60): Failure getting entry for 0x7f060000 (t=5 e=0) in package 0: 0xffffffb5
    08-09 03:05:36.092: WARN/RecognitionManagerService(60): no available voice recognition services found
    08-09 03:05:47.043: WARN/ResourceType(339): getEntry failing because entryIndex 29 is beyond type entryCount 1
    08-09 03:05:47.053: WARN/ResourceType(339): Failure getting entry for 0x7f02001d (t=1 e=29) in package 0: 0x80000001
    08-09 03:05:47.062: WARN/ResourceType(339): getEntry failing because entryIndex 28 is beyond type entryCount 1
    08-09 03:05:47.062: WARN/ResourceType(339): Failure getting entry for 0x7f02001c (t=1 e=28) in package 0: 0x80000001
    08-09 03:05:47.073: WARN/ResourceType(339): getEntry failing because entryIndex 20 is beyond type entryCount 1
    08-09 03:05:47.073: WARN/ResourceType(339): Failure getting entry for 0x7f020014 (t=1 e=20) in package 0: 0x80000001
    08-09 03:05:47.073: WARN/ResourceType(339): getEntry failing because entryIndex 11 is beyond type entryCount 1
    08-09 03:05:47.083: WARN/ResourceType(339): Failure getting entry for 0x7f02000b (t=1 e=11) in package 0: 0x80000001
    08-09 03:05:47.083: WARN/ResourceType(339): getEntry failing because entryIndex 17 is beyond type entryCount 1
    08-09 03:05:47.083: WARN/ResourceType(339): Failure getting entry for 0x7f020011 (t=1 e=17) in package 0: 0x80000001
    08-09 03:05:47.083: WARN/ResourceType(339): getEntry failing because entryIndex 14 is beyond type entryCount 1
    08-09 03:05:47.083: WARN/ResourceType(339): Failure getting entry for 0x7f02000e (t=1 e=14) in package 0: 0x80000001
    08-09 03:05:47.103: WARN/ResourceType(339): getEntry failing because entryIndex 5 is beyond type entryCount 1
    08-09 03:05:47.103: WARN/ResourceType(339): Failure getting entry for 0x7f020005 (t=1 e=5) in package 0: 0x80000001
    08-09 03:05:47.103: WARN/ResourceType(339): getEntry failing because entryIndex 8 is beyond type entryCount 1
    .............
    这些warning究竟是什么意思???
      

  7.   

    warning的监控很细节的,比如如果你的数组没用完控件也会提示,Service在System注册了,你没用,监控、、、
    你先把出错搞完了warning是优化的时候搞的
      

  8.   

    我遇到过类似的问题,应该是achartengine的setZoomButtonsVisible(true)方法有问题,取消就可以了,我的问题是这样解决的