2014-01-24 4 views
0

У меня есть изображение (мяч) его растровое изображение и оно перемещается во всех направлениях на экране, потому что я беру onDraw (canvas) в AnimatedView.java, работая отлично.Нажмите событие при перемещении изображения

Мои требования: Я хочу нажать на изображение, но, к сожалению, весь экран принимает это событие.

Пожалуйста, помогите мне.

Как получить событие click только на картинке? Чтобы я мог продолжить развитие.

Вот код:

MainActivity 

public class MainActivity extends Activity { 

    Context context; 
    int count=0; 
    EditText text; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     AnimatedView animatedView=(AnimatedView) findViewById(R.id.anim_view); 
     animatedView.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       EditText text=(EditText) findViewById(R.id.editText1); 

       ImageView imageView=(ImageView) findViewById(R.drawable.ball); 
       v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.anim.animation)); 


      } 
     }); 

animatedview.java: 

public class AnimatedView extends ImageView{ 

    private Context mContext; 
    int x = -1; 
    int y = -1; 
    private int xVelocity = 10; 
    private int yVelocity = 5; 
    private Handler h; 
    private final int FRAME_RATE = 30; 
    BitmapDrawable ball; 

    public AnimatedView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mContext = context; 
     h = new Handler(); 
    } 

    private Runnable r = new Runnable() { 
     @Override 
     public void run() { 
      invalidate(); 
     } 
    }; 

    @Override 
    protected void onDraw(Canvas c) { 

     BitmapDrawable ball = (BitmapDrawable) mContext.getResources().getDrawable(R.drawable.ball); 
     if (x<0 && y <0) { 
      x = this.getWidth()/2; 
      y = this.getHeight()/2; 
     } else { 
      x += xVelocity; 
      y += yVelocity; 
      if ((x > this.getWidth() - ball.getBitmap().getWidth()) || (x < 0)) { 
       xVelocity = xVelocity*-1; 
      } 
      if ((y > this.getHeight() - ball.getBitmap().getHeight()) || (y < 0)) { 
       yVelocity = yVelocity*-1; 
      } 
     } 
     c.drawBitmap(ball.getBitmap(), x, y, null); 

     h.postDelayed(r, FRAME_RATE);  

    } 


main.xml 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:background="#000000"> 

<com.example.example.AnimatedView 
     android:id="@+id/anim_view" 
     android:layout_width="fill_parent" 
     android:layout_height="420dp" 
     android:onClick="imageClicked" /> 
</LinearLayout> 

ответ

2
**I hope This codes Works for you, what you are looking for.....** 

This is the complete code representing both ball movement and touch on ball. 

public class MainActivity extends Activity implements OnTouchListener 
{ 
    BubbleGraphic bubbleGraphic; 
    int bm_x = 0, bm_y = 0, bm_offsetx, bm_offsety, bm_w, bm_h, subBM_w, subBM_h; 
    int f = 0; 
    private float x, y; 
    Canvas canvas; 
    boolean dm_touched = false; 
    static int random_x; 
    static int random_y; 
    boolean touching; 

    // These variable for position in x_axis direction 
    int w1; 

    // These variable for position in y_axis direction 
    int h1; 

    // These variable for velocity in x_axis direction 
    private int w1_V; 

    // These variable for velocity in y_axis direction 
    private int h1_V; 

    Bitmap mainBG; 
    Bitmap bmpBall; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     bubbleGraphic = new BubbleGraphic(this); 
     bubbleGraphic.setOnTouchListener(this); 

     // Your Background Image of Canvas 
     mainBG = BitmapFactory.decodeResource(getResources(), R.drawable.bg1); 

     w1 = -1; 
     h1 = -1; 
     w1_V = 1; 
     h1_V = 1; 

     // This is used to create bitmap object and decode the input stream into bitmap 
     bmpBall = BitmapFactory.decodeResource(getResources(), 
       R.drawable.myBall); 

     bm_w = bmpBall.getWidth(); 
     bm_h = bmpBall.getHeight(); 

     setContentView(bubbleGraphic); 

    } 

    protected void onPause() { 
     super.onPause(); 
     bubbleGraphic.pause(); 
    } 

    protected void onResume() { 
     super.onResume(); 
     bubbleGraphic.resume(); 
    } 

    public boolean onTouch(View v, MotionEvent event) { 
     switch (event.getAction()) { 

     case MotionEvent.ACTION_MOVE: 
      x = event.getX(); 
      y = event.getY(); 
      touching = true; 

      if (dm_touched) { 
       w1 = (int) x - bm_offsetx; 
       h1 = (int) y - bm_offsety; 
      } 
      break; 

     case MotionEvent.ACTION_DOWN: 
      x = event.getX(); 
      y = event.getY(); 
      touching = true; 

      // checking if Ball is touched 
      if ((x > w1) && (x < bm_w + w1) && (y > h1) && (y < bm_h + h1)) { 
       bm_offsetx = (int) x - w1; 
       bm_offsety = (int) y - h1; 
      } 

      dm_touched = true; 

      break; 

     case MotionEvent.ACTION_UP: 
     default: 

      dm_touched = false; 
      touching = false; 
     } 

     return true; 
    } 

    // **************************************************************************************// 
    // Creating Canvas graphic Class and running thread // 
    // *************************************************************************************// 

    class BubbleGraphic extends SurfaceView implements Runnable { 
     SurfaceHolder holder; 
     Thread thread = null; 
     boolean isRunning = false; 
     boolean holdingBubble = true; 
     private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 

     public BubbleGraphic(Context context) { 
      super(context); 
      holder = getHolder(); 
     } 

     public void pause() { 
      isRunning = false; 
      while (true) { 
       try { 
        thread.join(); 
       } catch (Exception e) { 
       } 
       break; 
      } 
      thread = null; 
     } 

     public void resume() { 
      isRunning = true; 
      thread = new Thread(this); 
      thread.start(); 
     } 

     public void run() { 
      while (isRunning) { 
       if (!holder.getSurface().isValid()) 
        continue; 

       canvas = holder.lockCanvas();`enter code here` 

       canvas.drawBitmap(mainBG, 0, 0, null); 

       paint.setStyle(Paint.Style.STROKE); 
       paint.setStrokeWidth(1); 
       paint.setColor(Color.TRANSPARENT); 

       if (touching) { 
        canvas.drawRect(x, y, x + bm_w, y + bm_h, paint); 
       } 

       canvas.drawBitmap(bmpBall, w1, h1, null); 

       // Method Responsible for ball movement and its position 
       checkBallMovementAndPosition(); 

       holder.unlockCanvasAndPost(canvas); 

      } 

     } 

     private void checkBallMovementAndPosition() { 
      if (w1 < 0 && h1 < 0) { 
       w1 = this.getWidth()/2; 
       h1 = this.getHeight()/2; 
      } else { 
       w1 += w1_V; 
       h1 += h1_V; 

       if ((w1 > this.getWidth() - bm_w) || (w1 < 0)) { 
        w1_V = w1_V * -1; 
        w1 += w1_V; 
       } 

       if ((h1 > this.getHeight() - bm_h) || (h1 < 0)) { 
        h1_V = h1_V * -1; 
        h1 += h1_V; 
       } 
      } 

     } 

    } 

} 


Note: Replace the images with Your images. 
+0

я жду прошлых 1 часов никто не может ответить на мой вопрос, славу и, для response.i я новый андроида, я не в состоянии справиться с этим сложным кодом , но я должен это сделать, если вы не возражаете, вы измените мой код. Если ур свободен только в противном случае, я попробую – vishnub1626

+0

Да! tav, я знаю, что его маленький комплексный код специально для новичка. Но если у вас есть знание Canvas и как его использовать, вы можете это понять. И если не ошибаетесь, это соответствует вашему требованию. –

+0

Я выполнил код ур. Я нашел 2 метода (bm_w = bmpTorch.getWidth(); bm_h = bmpTorch.getHeight()) в mainactivity.i не могу понять .will u пожалуйста, выполните мой код – vishnub1626

Смежные вопросы