我一直在开发我的游戏,我有很多图像按钮。我想从你们那里得到一些建议。有没有简化按钮状态的替代方法,因为我想拥有当用户按下时按钮外观会改变的功能
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:drawable="@drawable/setting1"
/>
<item
android:drawable="@drawable/setting"
/>
</selector>
就像现在这样,我的项目中有很多这样的东西,希望有另一种方式我被污染的可提取文件夹
您可以创建一个自定义ImageButton,并使用StateListDrawable以编程方式创建所有按钮状态,而不是拥有许多可绘制的xml选择器。示例如下:
首先创建从AppCompatImageButton
扩展的CustomButton,如下所示:
public class CustomButton extends androidx.appcompat.widget.AppCompatImageButton {
public CustomButton(@NonNull Context context) {
super(context);
init(context, null, 0);
}
public CustomButton(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public CustomButton(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs, defStyleAttr);
}
private void init(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr){
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomButton, defStyleAttr, 0);
try {
int defaultDrawableResId = typedArray.getResourceId(R.styleable.CustomButton_drawable_default, -1);
int pressedDrawableResId = typedArray.getResourceId(R.styleable.CustomButton_drawable_pressed, -1);
StateListDrawable stateListDrawable = new StateListDrawable();
if(pressedDrawableResId!=-1) {
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, ContextCompat.getDrawable(context, pressedDrawableResId));
}
if(defaultDrawableResId!=-1) {
stateListDrawable.addState(new int[]{}, ContextCompat.getDrawable(context, defaultDrawableResId));
}
setBackground(stateListDrawable);
}
catch (Exception e){
Log.e("CustomButton", e.getMessage());
}
finally {
typedArray.recycle();
}
}
}
在res>values>attrs.xml
下声明CustomButton样式,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CustomButton">
<attr name="drawable_default" format="reference" />
<attr name="drawable_pressed" format="reference" />
</declare-styleable>
</resources>
然后在每个需要的布局中使用这个CustomButton,只添加两个状态可绘制(按下|默认(app:drawable_default
和app:drawable_pressed
,就像下面的布局示例一样:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.my.packagename.CustomButton
android:layout_width="80dp"
android:layout_height="80dp"
app:drawable_default="@drawable/settings"
app:drawable_pressed="@drawable/settings1"/>
</RelativeLayout>
这将消除所有xml可绘制选择器,并使您能够重用CustomButton中使用的任何UI和任何逻辑。