如何在Android中将图像从左到右从右向左移动?

问题描述:

我是Android新手。我想从左到右,从右到左移动图像。当用户触摸图像的右侧图像时,它会向右侧移动。当用户触摸图像的右侧时,会发生一些事情。但图像将移动预定义点横跨x轴。如何在Android中将图像从左到右从右向左移动?

例如:图像将依次移动这些点上的p1(100,100),p2(150,100),p3(200,100),p4(250,100)。如果用户触摸p1的左侧,它将保持当前位置。在p4将发生所有事情。我可以将图像从p1移动到p2,将p2移动到p1。当我添加p3和p4时,它不像我预期的那样工作。

这是我的GameView类。

public class GameView extends SurfaceView{ 
    private Bitmap BG_image; 
    private SurfaceHolder holder; 
    //private GameLoopThread gameLoopThread;  
    int x; 
    int y; 
    private int srcX=100; 
    private int srcY=100; 
    int replaceX=0,areaThreshold=50; 
    int distance=50; 

    public GameView(Context context) { 

     super(context); 
     //gameLoopThread = new GameLoopThread(this); 
     holder = getHolder(); 
     holder.addCallback(new SurfaceHolder.Callback() { 

      @Override 
      public void surfaceDestroyed(SurfaceHolder holder) { 

/*    boolean retry = true; 
       gameLoopThread.setRunning(false); 

       while (retry) { 

        try { 

         gameLoopThread.join(); 
         retry = false; 

        } catch (InterruptedException e) { 

        } 
       }*/ 
      } 

      @Override 
      public void surfaceCreated(SurfaceHolder holder) { 

/*    gameLoopThread.setRunning(true); 
       gameLoopThread.start();*/ 
       Canvas c = holder.lockCanvas(null); 
       onDraw(c); 
       holder.unlockCanvasAndPost(c); 
      } 

      @Override 
      public void surfaceChanged(SurfaceHolder holder, int format, 

        int width, int height) { 
      } 
     }); 
     BG_image = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 
     Bitmap.createScaledBitmap(BG_image, BG_image.getWidth(), BG_image.getHeight(), false); 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     // TODO Auto-generated method stub 
       // x = (int) ev.getX(); 
       // y = (int) ev.getY(); 
       updateX(srcX); 
       replaceX=(int)ev.getX(); 
       int StartX=0, EndX=0; 
       StartX=replaceX-areaThreshold; 
       EndX=replaceX+areaThreshold; 
       if(StartX<=100){ 
        SurfaceHolder holder=getHolder(); 
        Canvas myCanvas=holder.lockCanvas(null); 
        onDraw(myCanvas); 
        holder.unlockCanvasAndPost(myCanvas); 
        srcX=100; 
       } 
       else if(StartX>100 && StartX<250){ 
        SurfaceHolder holder=getHolder(); 
        Canvas myCanvas=holder.lockCanvas(null); 
        onDraw(myCanvas); 
        holder.unlockCanvasAndPost(myCanvas); 
        srcX=srcX+distance; 
       } 
       if(EndX>100 && EndX<250){ 
        SurfaceHolder holder=getHolder(); 
        Canvas myCanvas=holder.lockCanvas(null); 
        onDraw(myCanvas); 
        holder.unlockCanvasAndPost(myCanvas); 
        srcX=srcX-distance; 
       } 
       else if(EndX>250){ 
        SurfaceHolder holder=getHolder(); 
        Canvas myCanvas=holder.lockCanvas(null); 
        onDraw(myCanvas); 
        holder.unlockCanvasAndPost(myCanvas); 
        srcX=250; 
       } 

     return super.onTouchEvent(ev); 
    } 
    @Override 
    protected void onDraw(Canvas canvas) { 
     // TODO Auto-generated method stub 
     updateX(srcX); 
     Paint paint = new Paint(); 
     canvas.drawColor(Color.BLACK); 
     canvas.drawRect(new Rect(0,0,getWidth(),getHeight()),paint); 
     canvas.drawBitmap(BG_image, srcX, srcY, null); 
    } 

    private int updateX(int srcX){ 
     this.srcX =srcX; 
     return srcX ; 

    } 
} 

请仔细阅读我的代码,给你解决我的问题提宝贵意见。 希望我会尽快回复!

+0

您的代码注释掉和混乱,你的解释有逻辑上的缺陷的详细信息。你可以做得更好。 – Anko 2011-06-18 12:46:35

+0

同意Aku。另外,你不应该直接调用'onDraw',你应该设置srcX值并调用'invalidate',它告诉系统安排一次调用'onDraw'。而'updateX'方法似乎没有任何用途。我认为你可以在这里消除大约一半的代码。 – DocDude 2011-06-21 17:32:25

现在,我明白我的问题。非常感谢您提出您的建议。 这是我更新的代码。

public class GameView extends SurfaceView{ 
    private Bitmap BG_image; 
    private SurfaceHolder holder; 
    int x=100; 
    private int srcX=100; 
    private int srcY=100; 
    int distance=50; 

    public GameView(Context context) { 

     super(context); 
     holder = getHolder(); 
     holder.addCallback(new SurfaceHolder.Callback() { 

      @Override 
      public void surfaceDestroyed(SurfaceHolder holder) { 

      } 

      @Override 
      public void surfaceCreated(SurfaceHolder holder) { 

       Canvas c = holder.lockCanvas(null); 
       onDraw(c); 
       holder.unlockCanvasAndPost(c); 
      } 

      @Override 
      public void surfaceChanged(SurfaceHolder holder, int format, 

        int width, int height) { 
      } 
     }); 
     BG_image = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 
     Bitmap.createScaledBitmap(BG_image, BG_image.getWidth(), BG_image.getHeight(), false); 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     // TODO Auto-generated method stub 
     x = (int) ev.getX();   
     if(x-srcX>0) 
      srcX += distance; 
     else if(x-srcX<0) 
      srcX -= distance; 

     if(srcX<=100) 
      srcX = 100; 
     else if(srcX>250) 
      srcX = 250;  
     Log.w("ev.getX : srcX",x+" : "+srcX); 
     SurfaceHolder holder=getHolder(); 
     Canvas myCanvas=holder.lockCanvas(null); 
     onDraw(myCanvas); 
     holder.unlockCanvasAndPost(myCanvas); 
     return super.onTouchEvent(ev); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     // TODO Auto-generated method stub 
     Paint paint = new Paint(); 
     canvas.drawColor(Color.BLACK); 
     canvas.drawRect(new Rect(0,0,getWidth(),getHeight()),paint); 
     canvas.drawBitmap(BG_image, srcX-BG_image.getWidth()/2, srcY, null); 
    } 
} 

这是很容易与Android TranslateAnimation

ImageView img_animation = (ImageView) findViewById(R.id.img_animation); 

TranslateAnimation animation = new TranslateAnimation(0.0f, 400.0f, 
      0.0f, 0.0f);   // new TranslateAnimation(xFrom,xTo, yFrom,yTo) 
    animation.setDuration(5000); // animation duration 
    animation.setRepeatCount(5); // animation repeat count 
    animation.setRepeatMode(2); // repeat animation (left to right, right to left) 
    //animation.setFillAfter(true);  

    img_animation.startAnimation(animation); // start animation 

找到这里move an image from left to right and right to left in android