2013-03-16 71 views
1

所以基本上我的畫布上繪製了一些圖像視圖,但是當我嘗試設置onclick監聽器並嘗試處理事件時,它不起作用。在畫布上繪製的視圖上設置onClickListener

public class DrawView extends View implements OnClickListener{ 
    Paint paint = new Paint(); 
    RectF rf = new RectF(30, 30, 80, 80); 
    BallView ball = new BallView(getContext()); 
    Bitmap bmp = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.ic_launcher); 

    public DrawView(Context context) { 
     super(context); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     ball.setOnClickListener(this); 
     ball.draw(canvas); 
     canvas.drawBitmap(bmp, 110, 10, paint); 

    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     Toast.makeText(getContext(), "Mock", Toast.LENGTH_SHORT).show(); 

    } 

} 

BallView.java

public class BallView extends ImageView { 
Paint b = new Paint(); 
public BallView(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
} 

public void onDraw(Canvas c){ 
    b.setColor(Color.BLUE); 
    c.drawCircle(50, 50, 40, b); 
} 

}

+0

*它不工作* - 而到底發生了什麼?什麼是'BallView'?如果它擴展View,請在'DrawView'的構造函數中移動* ball *和* bmp *的初始化。 – Luksprog 2013-03-16 08:44:57

+0

是否可點擊?你有沒有爲它調用過setClickable(true)? – sandrstar 2013-03-16 08:48:02

+0

@Luksprog按照你的說法做了,但沒有工作 – 2013-03-16 08:51:21

回答

1

基本上答案是:你的觀點是不接收觸摸事件,因爲它不是在視圖中的層次結構,所以點擊回調也不會被調用。實際上,視圖應該在View層次結構中(換句話說,添加到一些上層視圖,最後添加到窗口)以便參與用戶交互。
所以,如果你想實現覆蓋你的視圖的東西,那麼它應該是ViewGroup或者根本不應該關聯視圖,並且是一些抽象容器。
例如用下面點擊的工作方式沒有任何問題(但您將需要第二查看或修改BallView畫BMP): drawView函數:

public class DrawView extends FrameLayout implements View.OnClickListener { 
    BallView ball = new BallView(getContext()); 

    public DrawView(Context context) { 
     this(context, null, 0); 
    } 

    public DrawView(final Context context, final AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public DrawView(final Context context, final AttributeSet attrs, final int defStyle) { 
     super(context, attrs, defStyle); 
     addView(ball); 
     ball.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     Toast.makeText(getContext(), "Mock", Toast.LENGTH_SHORT).show(); 
    } 
} 

BallView類保持不變。
佈局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 
    <com.ruinalst.performance.tests.views.DrawView 
      android:id="@+id/oscillator" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_centerInParent="true" /> 
</RelativeLayout> 
+0

這是真的,但我想使用畫布而不是佈局的主要原因是我的遊戲有動畫和動作,可以輕鬆地在畫布上重新繪製。雖然我是初學者,但如果我在這裏錯了,請糾正我。但是,謝謝@sandrstar的意見。 – 2013-03-16 10:11:35

+1

然後我會建議檢查Pro Android遊戲書(嘗試在谷歌上搜索'Pro Android Games pdf') - 它包含一些在畫布上繪製的基本示例。關於觸摸處理,最好在您自己的功能中檢查觸摸座標,並且不要在ClickListeners上進行中繼(不過,我對遊戲開發不是很有經驗)。 – sandrstar 2013-03-16 10:20:03

+0

謝謝,我會檢查它 – 2013-03-16 10:36:34