Diferença entre um ImageView clicável e um ImageButton

149

Só estou me perguntando se existe alguma diferença significativa entre um ImageViewque está definido para ser clicável, em comparação com um ImageButton?

Existe alguma razão para usar um sobre o outro? Existe alguma restrição no drawable para um ImageButtonque sai ImageViewcomo a única opção possível?

Será que eu, eventualmente, perder qualquer funcionalidade de um botão se eu optar por um clickable ImageViewmais ImageButton?

yjw
fonte

Respostas:

158

Não há diferenças, exceto o estilo padrão. ImageButtontem um plano de fundo não nulo por padrão.

EDIT : Além disso, o ImageButton.onSetAlpha()método sempre retorna false, scaleTypeé definido como centere sempre é inflado como focalizável.

Aqui está ImageButtono estilo padrão:

 <style name="Widget.ImageButton">
     <item name="android:focusable">true</item>
     <item name="android:clickable">true</item>
     <item name="android:scaleType">center</item>
     <item name="android:background">@android:drawable/btn_default</item>
 </style>
Michael
fonte
1
Obrigado pela sua resposta. Você me deu mais do que eu vi ao passar pelo código eu mesmo. Acho que no final do dia, a seleção entre os 2 dependerá de quanto das propriedades padrão você pode usar sem nenhuma personalização.
yjw
De nada! Sim, não há muita diferença, então a escolha é entre botão e não, eu acho.
1128 Michael
20
Na verdade, na minha experiência, outra diferença entre os dois é que, se você deseja colocar um botão clicável na célula de um ListView, mantendo a própria célula como clicável, é muito melhor fazer uma visualização de imagem. EditTexts e ImageButtons parecem consumir o evento de toque quando TextViews e ImageViews não.
Ernir Erlingsson 29/11
Eu tinha usado o ImageView clicável, mas conforme o novo requisito, tenho que alterá-los para ImageButton, mas a imagem usada é inflada. Como evitar a inflação da imagem no ImageButton?
codeRider
@codeRider Não sei ao certo o que você quer dizer. Se o seu posicionamento diferir do que estava, ImageViewvocê pode e especificar scaleTypeexplicitamente.
Michael
24

ImageButton é herdado do ImageView

public class ImageButton extends ImageView {
public ImageButton(Context context) {
    this(context, null);
}

public ImageButton(Context context, AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.imageButtonStyle);
}

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

@Override
protected boolean onSetAlpha(int alpha) {
    return false;
}

@Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
    super.onInitializeAccessibilityEvent(event);
    event.setClassName(ImageButton.class.getName());
}

@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
    super.onInitializeAccessibilityNodeInfo(info);
    info.setClassName(ImageButton.class.getName());
}

como @Micheal descreve eu apenas adiciono detalhes à sua resposta

Zar E Ahmer
fonte
Como isso responde às várias perguntas do OP?
flawyte 8/07
7

O efeito de um clique no botão quando clico está lá para o botão de imagem, mas não para o imageView.

Prashanth Debbadwar
fonte