2011-09-06 8 views
6

私は2つの画像が画面を横切って動き、1つはボール、もう1つは男です。 私がしたいのは、ユーザーが男のイメージに触れ、ボールが落ちたときです。AndroidカスタムのためにOnClickイベントを追加する方法

私の問題は、onclick/ontouchイベントを追加して動作させるように見えないことです。

私はそれを正しく実装していません。だれでも助けてくれますか?

以下の3つのクラスを追加しました。グレッグは、人とボールがボールという名前が付けられている:)

TestAnimationActivity.java

事前に
package com.test.firstAnimation; 

    import android.app.Activity; 
    import android.os.Bundle; 

    public class TestAnimationActivity extends Activity { 
     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(new MyAnimationView(this)); 
     } 
    } 

Sprite.java

package com.test.firstAnimation; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Toast; 

public class Sprite extends View implements OnClickListener{ 

    private static int gregCoordX = 410; // the x coordinate at the canvas for greg 
    private Bitmap img; // the image of Greg 
    private Bitmap img2; // the image of pointer 
    private static int gregCoordY = 125; // the y coordinate at the canvas for greg 
    private static int pointCoordX = 10; 
    private static int pointCoordY = 10; 
    private static int count = 1; 
    private static int ballSpeed = 25; 
    private static boolean goingRight = false; 
    private static boolean goingLeft = true; 
    private static boolean pointerGoingRight = false; 
    private static boolean pointerGoingLeft = true; 


    public Sprite(Context context, int drawable) { 

     super(context); 

     BitmapFactory.Options opts = new BitmapFactory.Options(); 
     opts.inJustDecodeBounds = true; 
     img = BitmapFactory.decodeResource(context.getResources(), drawable); 
     img2 = (BitmapFactory.decodeResource(context.getResources(), drawable)); 
     count++; 
    } 

    public static int getCount() { 
     return count; 
    } 

    void setX(int newValue) { 
     gregCoordX = newValue; 
    } 

    public static int getX() { 
     return gregCoordX; 
    } 

    public static int getY() { 
     return gregCoordY; 
    } 

    public static int getBX() { 
     return pointCoordX; 
    } 

    public static int getBY() { 
     return pointCoordY; 
    } 

    public Bitmap getBitmap() { 
     return img; 
    } 

    public Bitmap getImg2() { 
     return img2; 
    } 

    public static void dropBall() 
    { 
     pointCoordY++; 
    } 

    public static void moveBall(int x) { 

      // check the borders 
      //if more than ten go right 
      //if ten go left 
      //if more than 250 go left 
      if (x <= 10 && pointerGoingLeft) 
      { 
      pointCoordX = pointCoordX + ballSpeed; 
      pointerGoingRight = true; 
      pointerGoingLeft = false; 
      } 
      else if (x >= 410 && pointerGoingRight) 
      { 
       pointCoordX = pointCoordX - ballSpeed; 
       pointerGoingLeft = true; 
       pointerGoingRight = false; 
      } 
      else if (pointerGoingRight) 
       pointCoordX = pointCoordX + ballSpeed; 
      else 
       pointCoordX = pointCoordX - ballSpeed; 

      if(MyAnimationView.ballDropping == true) 
      { 
       while (pointCoordY<gregCoordY) 
        dropBall(); 
      } 
    } 

    public static void moveGreg(int x) { 

     if (x <= 10 && goingLeft) 
     { 
     gregCoordX = gregCoordX + count; 
     goingRight = true; 
     goingLeft = false; 
     } 
     else if (x >= 410 && goingRight) 
     { 
     gregCoordX = gregCoordX - count; 
     goingLeft = true; 
     goingRight = false; 
     } 
     else if (goingRight) 
     gregCoordX = gregCoordX + count; 
     else 
     gregCoordX = gregCoordX - count; 
} 

    @Override 
    public void onClick(View arg0) { 
     dropBall(); 
    } 
} 

MyAnimationView.java

package com.test.firstAnimation; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.view.View; 

public class MyAnimationView extends View{ 

    private Sprite greg; 
    private Sprite ball; 
    private int xCoOr; 
    private int ballXCoOr; 
    public static boolean ballDropping; 

    public MyAnimationView(Context context) { 
     super(context); 

     ballDropping = false; 
     greg = new Sprite(context,R.drawable.greg); 
     ball = new Sprite(context, R.drawable.ball); 

     OnClickListener gregClicked = new OnClickListener() { 
      public void onClick(View v) { 
      ballDropping = true; 
      } 
     }; 
     greg.setOnClickListener(gregClicked); 
     } 

    @Override protected void onDraw(Canvas canvas) { 

    canvas.drawColor(0xFFFFFFFF);         //white background  

    ballXCoOr = Sprite.getBX(); 
    xCoOr = Sprite.getX(); 
    Sprite.moveGreg(xCoOr);           //move ball left or right depending 
    Sprite.moveBall(ballXCoOr); 

    if(ballDropping == true) 
    { 
     Sprite.dropBall(); 
    } 

    canvas.drawBitmap(greg.getBitmap(), xCoOr, Sprite.getY(), null); 
    canvas.drawBitmap(ball.getBitmap(), ballXCoOr, Sprite.getBY(), null); 
    invalidate(); 
    } 
} 

おかげで、私は数日間立ち往生した!その後

ベン

+0

私はこれが私の最初の投稿です、貧しい人々の書式について謝罪:) –

+0

私はスプライトビューはMyAnimationViewのサブビューではありませんので、あなたのコードが動作するとは思いません。ビューは決して使用されないので、onClickリスナーは起動しません。ビットマップを読み込んでonDrawで描画するだけです。私はこれを答えとして掲示するだろうが、解決策ではなく問題である。 –

+0

この解決策を見てください:http://stackoverflow.com/a/17978891/779408 – breceivemail

答えて

8
float touched_x, touched_y; 
    boolean touched = false; 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     // TODO Auto-generated method stub 
     touchCounter++; 
     touched_x = event.getX(); 
     touched_y = event.getY(); 

     int action = event.getAction(); 
     switch (action) { 
     case MotionEvent.ACTION_DOWN: 
      touched = true; 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touched = true; 
      break; 
     case MotionEvent.ACTION_UP: 
      touched = false; 
      break; 
     case MotionEvent.ACTION_CANCEL: 
      touched = false; 
      break; 
     case MotionEvent.ACTION_OUTSIDE: 
      touched = false; 
      break; 
     default: 
     } 
     return true; // processed 
    } 

if (touched) { 
     //control here 
    } 

touched_x、touched_yは、画面上でクリックされたポイントの座標です。 Gregの座標とこれらの座標を比較することができます。同じ場合は、あなたがしたいことをやりなさい。

+0

助けてくれてありがとう、それを試してみてください:) –

4


public class CustomView extends View implements OnClickListener { 

    public CustomView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    public CustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public CustomView(Context context) { 
     super(context); 
     init(); 
    } 

    private void init(){ 
     setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 

     // Do whatever you need to 
    } 

} 
関連する問題