移动图像时单击事件

时间:2014-01-24 09:42:12

标签: android android-animation

我有一个图像(球)它是一个BitmapDrawable并且它在屏幕上的所有方向上移动,因为我在AnimatedView.java中使用onDraw(画布)它的工作正常。

我的要求: 我想点击图片,但不幸的是整个屏幕都是这个事件。

请帮帮我。

如何仅在图片上获取点击事件? 这样我就可以继续进一步发展了。

以下是代码:

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>

1 个答案:

答案 0 :(得分: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.