大家帮忙看一下这个程序,我已经实现了图像能够按照一定的路径移动,但是我单机屏幕时图像为什么不停止运动呢,怎么实现当我触屏时图像能随着我的手指的移动而改变方向,而不是按照原来的方向啊,谢谢大家啊,请求高手指点,最好有代码,,谢啦!
package been.myplace; 
import java.io.InputStream;import java.util.ArrayList;
import java.util.Random; import android.app.*;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Resources;
import android.graphics.*;
import android.os.*;
import android.util.*;
import android.view.*;
import android.view.SurfaceHolder.Callback;
import android.widget.AbsoluteLayout;
import android.widget.ImageView;
public class been extends Activity { 
 
   static Bitmap bitmap1;
    protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(new been1(this));
 this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);     //强制横屏。
 
  
         
  
 
}
       
    static public class been1 extends SurfaceView implements Runnable,Callback
    {
       boolean isRunning=true;
     private SurfaceHolder sfh=null;    
     private static Canvas canvas=new Canvas();
//     private Thread th=new Thread();
     private Paint p=new Paint();
     private Bitmap bitmap;
     private float screenW,screenH;
 
     Handler handler;
        static int dx;
        
     static int left=0;
    
    
    Thread th=new Thread(this);
    
public been1(Context context) {
super(context);
sfh=getHolder();
sfh.addCallback(this);
p.setAntiAlias(true);
this.setKeepScreenOn(true);// 保持屏幕常亮   
}
  public void onDraw()
    {
       super.onDraw(canvas);
      // initmap();
       bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.garden);
       canvas.drawBitmap(bitmap,0,0,null);
//        Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.been);
//        canvas.drawBitmap(bitmap1, 0, 0, p);
       
       Resources rec = getResources();
       InputStream in = rec.openRawResource(R.drawable.been);
    // 设置图片
 
       Bitmap bitmap1 =BitmapFactory.decodeStream(in);
           
       // 绘制图片
 
       canvas.drawBitmap(bitmap1, left,getTop(), p);   
        }
  
  public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
isRunning=false;
 
} public void run() {
// TODO Auto-generated method stub
  bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.been);
       canvas.drawBitmap(bitmap1, left, getTop(), p);
while(isRunning){



synchronized (sfh) {
for( dx=0;dx<=getWidth();dx++){

dx = left < 0 || left > (getWidth() - bitmap1.getWidth()) ? -dx : dx;
left = left+dx;
// handler.post(new Runnable() {
// public void run() {
//  invalidate();}
//
// });


canvas=sfh.lockCanvas();//取得并锁住当前画布对象(全范围)。
onDraw();
    sfh.unlockCanvasAndPost(canvas);//结束锁定画图,并提交改变。
    }
// if(left==getWidth()){dx=0;}
try
{
Thread.sleep(1000);
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
  
  public boolean onTouchEvent(MotionEvent event) {
  isRunning = false;
  th.stop();
  //当点击屏幕,则将图片浮动停止  
  return true;
  
  
  }
  
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub

} public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
//System.out.println(screenW+" "+screenH);
isRunning=true;
// th=new Thread(this);
th.start();
}
    }
    

解决方案 »

  1.   

    我已经解决了上面的问题,但是不知道怎么进行图片的切换,即当图片运动到屏幕的端点怎么将其自动切换到另一张图片啊 请各位高手指点啊 代码如下: package been.myplace; 
    import java.io.InputStream;import java.util.ArrayList;
    import java.util.Random; import android.app.*;
    import android.content.Context;
    import android.content.pm.ActivityInfo;
    import android.content.res.Resources;
    import android.graphics.*;
    import android.os.*;
    import android.util.*;
    import android.view.*;
    import android.view.SurfaceHolder.Callback;
    import android.widget.AbsoluteLayout;
    import android.widget.ImageView;
    public class been extends Activity { 
     
       static Bitmap bitmap1,bitmap2;
       static boolean mf=true;
        protected void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(new been1(this));
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);     //强制横屏。
     
     
    }
           
         static public class been1  extends SurfaceView implements Runnable,Callback
        {
        
        
          boolean flag; //线程标示位 当为false时停止刷新界面     SurfaceHolder surfaceHolder;     GameViewThread gameViewThread;     float x=0,y=0;     int direction=0;  //图片运行方向 控制图片向上 或向下运动     int width,height;
          static  boolean isRunning=true;
    //     private SurfaceHolder sfh=null;    
         private static Canvas canvas=new Canvas();
    //     private Thread th=new Thread();
         private Paint p=new Paint();
         private Bitmap bitmap;
         private float screenW,screenH;
     
         Handler handler;
            static int dx;
            
         static int left=0;
        
        
         Thread th=new Thread(this);
        
    public been1(Context context) {
    super(context);
    surfaceHolder=this.getHolder();
    //            sfh=getHolder();
    surfaceHolder.addCallback(this);
    p.setAntiAlias(true);
    this.setKeepScreenOn(true);// 保持屏幕常亮   
    bitmap1=BitmapFactory.decodeResource(getResources(), R.drawable.been);
    //设置焦点 如果不设置焦点的话 在该界面下 点击触摸屏是无效的 默认为false

    setFocusable(true);
    setFocusableInTouchMode(flag);
    }
      public void onDraw()
        {
           super.onDraw(canvas);
          // initmap();
           bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.garden);
           bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.been);
           bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.leftbeen);
           canvas.drawBitmap(bitmap,0,0,null);
    //        canvas.drawBitmap(bitmap1, x, y, p);
    //        canvas.drawBitmap(bitmap2, x, y, p); 
           
            
         
            
        }
      
      public void run() {
    // TODO Auto-generated method stub
       
           
    while(isRunning){
    synchronized (surfaceHolder) {
    for( dx=0;dx<=getWidth();dx++){

    dx = x < 0 || x > (getWidth() - bitmap1.getWidth()) ? -dx : dx;
    x = x+dx;

      canvas=surfaceHolder.lockCanvas();//取得并锁住当前画布对象(全范围)。
    onDraw();
    surfaceHolder.unlockCanvasAndPost(canvas);//结束锁定画图,并提交改变。
        }
       
    try
    {
    Thread.sleep(1000);
    }catch(InterruptedException e)
    {
    e.printStackTrace();
    }
    }
    }
    }
      
     
    public boolean onTouchEvent(MotionEvent event) {
    //  float x = event.getX(); 
    //  float y = event.getY(); 
     
    if(event.getAction()==MotionEvent.ACTION_DOWN){ //处理屏幕屏点下事件 手指点击屏幕时触发 x=event.getX(); y=event.getY(); }else if(event.getAction()==MotionEvent.ACTION_UP){//处理屏幕屏抬起事件  手指离开屏幕时触发 }else if(event.getAction()==MotionEvent.ACTION_MOVE){//处理移动事件 手指在屏幕上移动时触发 x=event.getX(); y=event.getY(); }

    // synchronized(this){
    //
    //            try{
    //
    //                this.wait(8000);     //让事件线程休眠 减少触发次数
    //
    //             }catch(InterruptedException e){
    //
    //              e.printStackTrace();
    //
    //            }         
    //
    //           } return true;  //此处需要返回true 才可以正常处理move事件 详情见后面的  说明   }

    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
    // TODO Auto-generated method stub

    } public void surfaceCreated(SurfaceHolder arg0) {
    // TODO Auto-generated method stub
    width=this.getWidth(); height=this.getHeight();

    isRunning=true;
    // th=new Thread(this);
    th.start();
    // boolean a=flag;
    // while(a==true){
    // try {
    // th.sleep(1000);
    // } catch (InterruptedException e) {
    // // TODO Auto-generated catch block
    // e.printStackTrace();
    // }
    // gameViewThread=new GameViewThread();
    //                flag=true;
    //                gameViewThread.start();

    // a=false;
    // }

        if(flag){
         gameViewThread=new GameViewThread();
    //        flag=true;
            gameViewThread.start();
         try {
    th.sleep(1000);
    } catch (Exception e) {
    // TODO: handle exception
    }
          flag=false;
          isRunning=true;
        }
    }
     public void surfaceDestroyed(SurfaceHolder arg0) {
    // TODO Auto-generated method stub
    isRunning=false;
     flag=false;
     
    }
    class GameViewThread extends Thread{// public boolean flag; public void run(){ while(flag){ Canvas canvas=null; try{ canvas=surfaceHolder.lockCanvas(); //锁定画布 并获取canvas onDraw(canvas);//调用onDraw 渲染到屏幕 surfaceHolder.unlockCanvasAndPost(canvas); //此步不要忘记了喔 否则界面上显示不出来的 }catch(Exception e){ e.printStackTrace(); }
    try { Thread.sleep(10);//线程休眠时间  控制帧数 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }  //每10毫秒刷新一次
    } } } 

        }
        
    }
      

  2.   

    自动换图片我已经实现了 可是怎么实现当我点击屏幕时,如果触点在图片左边,当图片移动到此地方并再次运动而此次运动图片向左运动(未触屏前图片向右运动) 谢谢大家了,代码如下:
     package been.myplace; 
    import java.io.InputStream;import java.util.ArrayList;
    import java.util.Random; import android.app.*;
    import android.content.Context;
    import android.content.pm.ActivityInfo;
    import android.content.res.Resources;
    import android.graphics.*;
    import android.os.*;
    import android.util.*;
    import android.view.*;
    import android.view.SurfaceHolder.Callback;
    import android.view.ViewGroup.MarginLayoutParams;
    import android.widget.AbsoluteLayout;
    import android.widget.ImageView;
    public class been extends Activity { 
     
       static Bitmap bitmap1,bitmap2;
     
        protected void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(new been1(this));
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);     
     
     
    }
           
         static public class been1  extends SurfaceView implements Runnable,Callback
        {
          
           
          SurfaceHolder surfaceHolder;
         float x=0,y=30;
         int width,height;
         static boolean flag;      static  boolean isRunning=true,isRight = true;
        
         private static Canvas canvas=new Canvas();
         private Paint p=new Paint();
         private Bitmap bitmap;
         private float screenW,screenH;
     
         Handler handler;
            static int dx;
            static int left=0;
         Thread th=new Thread(this);
        
    public been1(Context context) {
    super(context);
    surfaceHolder=this.getHolder();
    surfaceHolder.addCallback(this);
    p.setAntiAlias(true);
    this.setKeepScreenOn(true); 
    bitmap1=BitmapFactory.decodeResource(getResources(), R.drawable.been);
     
    setFocusable(true);
    setFocusableInTouchMode(true);
    }
    public void onDraw()
    {
    super.onDraw(canvas);

    bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.garden);
    bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.been);
    bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.leftbeen);
    canvas.drawBitmap(bitmap,0,0,null);
    if(isRight){
    canvas.drawBitmap(bitmap1, x, y, p);
    }
    else {
    canvas.drawBitmap(bitmap2, x, y, p);
    }

     

    if(true){
    y=30;
    }
    }



    public void run() {
    // TODO Auto-generated method stub
     
    while(isRunning){
    if(x>getWidth()-55){
    isRight = false;
    }
    if(x<0){
    isRight = true;
    }
    if(isRight){
    x += 10;
    }
    else {
    x -= 10;
    }
    canvas=surfaceHolder.lockCanvas(); 
    onDraw();
    surfaceHolder.unlockCanvasAndPost(canvas); 
        

    try
    {
    Thread.sleep(10);
    }catch(InterruptedException e)
    {
    e.printStackTrace();
    }
     
    }
        }
         
         
         public boolean onTouchEvent(MotionEvent event) {
          
          
          if(event.getAction()==MotionEvent.ACTION_DOWN){  
          flag=true;
          
          x=event.getX();
          
          y=event.getY();
          
          
          
          }else if(event.getAction()==MotionEvent.ACTION_UP){ 
          flag=true;
          
          
        
          }else if(event.getAction()==MotionEvent.ACTION_MOVE){ 
          flag=true;
          x=event.getX();
          
          y=event.getY();
          
          
          
          }
         
          return true;   
          
         }
         
         public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
          // TODO Auto-generated method stub
          
         }
         
         public void surfaceCreated(SurfaceHolder arg0) {
          // TODO Auto-generated method stub
          width=this.getWidth();
          
          height=this.getHeight();
          
          th.start();
     
          
         }
         public void surfaceDestroyed(SurfaceHolder arg0) {
          // TODO Auto-generated method stub
          isRunning=false;
     
         }
         
       
        }
        
    }