3

我創建了一個自定義視圖,當按下,突出顯示或禁用時,它應該更改它的背景圖像。該應用程序運行,但按鈕不會改變它的背景。自定義視圖沒有響應觸摸

這裏是我的代碼:

public class CustomImageButton extends View { 

public CustomImageButton(Context context) { 
super(context); 
setFocusable(true); 
setClickable(true); 
} 

public CustomImageButton(Context context, AttributeSet attrs) { 
super(context, attrs); 
setFocusable(true); 
setClickable(true); 
} 
public CustomImageButton(Context context, AttributeSet attrs, int defStyle) { 
super(context, attrs, defStyle); 
setFocusable(true); 
setClickable(true); 
} 

protected Drawable background = super.getBackground(); 


@Override 
public void setBackgroundDrawable(Drawable d) { 
// Replace the original background drawable (e.g. image) with a LayerDrawable that 
// contains the original drawable slightly edited. 

CustomImageButtonBackgroundDrawable layer = new CustomImageButtonBackgroundDrawable(d); 
super.setBackgroundDrawable(layer); 
} 

public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
int drawableWidth = super.getBackground().getMinimumWidth(); 
int drawableHeight = super.getBackground().getMinimumHeight(); 
setMeasuredDimension(drawableWidth, drawableHeight); 
} 

protected class CustomImageButtonBackgroundDrawable extends LayerDrawable { 

    protected Drawable lowerlayer; 
    protected Drawable _highlightedDrawable; 

    protected int _disabledAlpha = 100; 
    protected Drawable _pressedDrawable; 


    public CustomImageButtonBackgroundDrawable(Drawable d) { 
      super(new Drawable[] { d }); 
    } 

    @Override 
    protected boolean onStateChange(int[] states) { 
     boolean enabled = false; 
     boolean highlighted = false; 
     boolean pressed = false; 

     for (int state : states) { 
     if (state == android.R.attr.state_enabled) 
      enabled = true; 
     else if (state == android.R.attr.state_selected) 
      highlighted = true; 
     else if (state == android.R.attr.state_pressed) 
      pressed = true; 
     } 

     mutate(); 
     if (enabled && highlighted) { 
     ColorFilter colourFilter = new LightingColorFilter(Color.YELLOW, 1); 
     ScaleDrawable resizedImage = new ScaleDrawable(background, 0, 1.25f, 1.25f); 

     lowerlayer = resizedImage.getDrawable(); 
     lowerlayer.setColorFilter(colourFilter); 

     Drawable[] aD = new Drawable[2]; 
     aD[0] = lowerlayer; 
     aD[1] = background; 
     LayerDrawable _highlightedDrawable = new LayerDrawable(aD); 

     setBackgroundDrawable(_highlightedDrawable); // buttons need transparent backgrounds 

     } else if (!enabled) { 
     setColorFilter(null); 
     setAlpha(_disabledAlpha); 

     } else if (enabled && pressed){ 
     ScaleDrawable smaller = new ScaleDrawable(background, 0, 0.75f, 0.75f); 

     setBackgroundDrawable(smaller.getDrawable()); 

     } else if(enabled){ 
     setBackgroundDrawable(background); 
     setColorFilter(null); 
     } 

     invalidateSelf(); 

     return super.onStateChange(states); 
    } 

} 

} 

,這裏是我的xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="#ffffff"> 

<ImageButton 
    android:id="@+id/title" 
    android:layout_width="250dp" 
    android:layout_height="58dp" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_margin ="25dp" 
    android:background="@drawable/skintonetitle" /> 

<custombuttons.CustomImageButton 
    android:id="@+id/skina1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/title" 
    android:layout_below="@+id/title" 
    android:layout_marginTop="35dp" 
    android:background="@drawable/test_circle" 
    android:clickable="true" 
    android:focusable="true" /> 

</RelativeLayout> 

事情我已經錯過了嗎?

回答

5

它從視圖而不是按鈕延伸,所以默認情況下它不是可點擊或可調焦的。在您的XML中使用

android:clickable="true" 
android:focusable="true" 

setFocusable(true); 
setClickable(true); 
+0

啊這是有道理的:

您還可以,如果你想這樣做在Java中設置這些在你的視圖類的構造函數。我會在下班後嘗試。我可以使我的自定義按鈕類中的視圖可默認點擊和可聚焦嗎? –

+0

Yup-我的回答中的那兩行是XML屬性。您可以將它們放在您的

+0

哦對不起,我的意思是我可以重寫我的自定義按鈕src中的方法,以使其默認爲可點擊。所以我不需要在每個xmls中添加行。 –