2013-10-06 33 views
0

我做了一個自定義視圖 - 它擴展了View。在onDraw()方法中,我創建了一個半徑設置的圓。目前在我的XML中,我的layout_widthlayout_height設置爲wrap_content。圓是正確的大小,但當我設置一個onClickListener我不必觸摸該圓註冊。我可以在任何沒有其他觀點的地方挖掘。自定義視圖測量

我想我需要做一些事情onMeasureLayoutParams但我不知道究竟是什麼。

我的目標是僅在layout_widthheight仍設置爲wrap_content時單擊圓圈時纔會調用onClickListener

編輯:

這將創建一個正方形不是一個圈子,因爲我想要的。

這裏是我的代碼:

protected void onDraw(Canvas canvas) { 

     canvas.drawCircle(canvas.getWidth() /2 , canvas.getHeight() /2, 
       RADIUS, paint); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     // TODO Auto-generated method stub 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

     widthMeasureSpec = RADIUS; 
     heightMeasureSpec = RADIUS; 

     setMeasuredDimension(widthMeasureSpec, heightMeasureSpec); 

    } 
+1

'wrap_content'表示使用的最小尺寸,其包裝這一觀點的內容,所以你需要告訴機器人什麼的最小尺寸在'onMeasure()'方法中。 – Luksprog

+0

@Luksprog所以,我可以讓'widthMeasureSpec,heightMeasureSpec'等於我的圓的半徑?編輯:是的,這有效,但它使一個方... – RiThBo

+1

使用半徑是一個基本的方法,你想要什麼,但一個視圖可以收到一些其他的限制。一個視圖也是一個矩形,所以你不能使它成爲一個圓或任何其他形狀。但是,您可以覆蓋它的'onTouch'方法,並且只有在圓圈區域中註冊觸摸時才觸發點擊事件。 – Luksprog

回答

0

試試這個:

float mTranslateX; 
float mTranslateY; 
public void onDraw(Canvas canvas){ 
    super.onDraw(canvas); 
    canvas.save(); 
    canvas.translate(mTranslateX, mTranslateY); 
    canvas.drawCircle(0, 0, RADIUS, paint); 
    canvas.restore(); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    final int dia = RADIUS * 2; 
    int w = resolveSize(dia, widthMeasureSpec); 
    int h = resolveSize(dia, heightMeasureSpec); 
    setMeasuredDimension(w, h); 
    float radius = Math.min(w, h)/2F; 
    mTranslateX = radius; 
    mTranslateY = radius; 
} 
+0

感謝您的回答,但仍然會以圓環形式輸出。 – RiThBo

+0

你到底想要什麼? –

+0

對不起!我的意思是它仍然輸出爲一個正方形 – RiThBo