Android 已使用资源向drawable添加背景
我的布局中有两个图像按钮,一个是不可见的,当单击可见的按钮时,它将其图像资源设置为不可见的图像按钮,并将其设置为可见,如下所示Android 已使用资源向drawable添加背景,android,xml,image,background,Android,Xml,Image,Background,我的布局中有两个图像按钮,一个是不可见的,当单击可见的按钮时,它将其图像资源设置为不可见的图像按钮,并将其设置为可见,如下所示 btn1.setOnClickListener(new OnClickListener() { public void onClick(View v) { btnmt2.setImageResource(R.drawable.happy); btnmt2.setVisibility(View.VISIBL
btn1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
btnmt2.setImageResource(R.drawable.happy);
btnmt2.setVisibility(View.VISIBLE);
btnmt2.setScaleType(ImageView.ScaleType.FIT_CENTER);
btnmt2.setPadding(5,5,5,5);
if (android.os.Build.VERSION.SDK_INT < 16) {
btnmt2.setBackgroundResource(R.drawable.dropshadow);
} else {
btnmt2.setBackground(getResources().getDrawable(R.drawable.dropshadow));
}
但是“可见图像”按钮有一个背景(背景是xml中定义为两个形状的阴影)我希望图像在移动到“不可见图像”时保持此背景,因此我尝试在xml中添加此背景,但没有效果,图像资源似乎失去了缩放或填充,延伸到背景的完整大小,因此,我尝试将其添加到java文件中,处理不推荐使用的方法,如下所示
btn1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
btnmt2.setImageResource(R.drawable.happy);
btnmt2.setVisibility(View.VISIBLE);
btnmt2.setScaleType(ImageView.ScaleType.FIT_CENTER);
btnmt2.setPadding(5,5,5,5);
if (android.os.Build.VERSION.SDK_INT < 16) {
btnmt2.setBackgroundResource(R.drawable.dropshadow);
} else {
btnmt2.setBackground(getResources().getDrawable(R.drawable.dropshadow));
}
if(android.os.Build.VERSION.SDK_INT<16){
btnmt2.挫折背景资源(R.可绘制.阴影);
}否则{
setBackground(getResources().getDrawable(R.drawable.dropshadow));
}
这保留了比例和填充,但没有添加背景,有人能帮我吗,不确定这是不是我的xml图像
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item >
<shape
android:shape="rectangle">
<solid android:color="@android:color/transparent" />
<corners android:radius="5dp"/>
</shape>
</item>
<item android:right="18dp" android:left="18dp" android:top="10dp" android:bottom="4dp">
<shape
android:shape="rectangle">
<solid android:color="@android:color/darker_gray"/>
<corners android:radius="10dp"/>
</shape>
</item>
</layer-list>
实际上存在一个已知的错误,通过资源文件设置视图的背景可能会导致其丢失填充(不过需要一个参考链接。稍后再查看) 实际上,我使用以下3种方法来解决这个问题,即在实际加载图像之前/之后保存并恢复填充:
public static void setBackgroundResourceAndKeepPadding(View v, int resourceId) {
int top = v.getPaddingTop();
int left = v.getPaddingLeft();
int right = v.getPaddingRight();
int bottom = v.getPaddingBottom();
v.setBackgroundResource(resourceId);
v.setPadding(left, top, right, bottom);
}
public static void setBackgroundDrawableAndKeepPadding(View v, Drawable drawable) {
int top = v.getPaddingTop();
int left = v.getPaddingLeft();
int right = v.getPaddingRight();
int bottom = v.getPaddingBottom();
setBackgroundDrawable(v, drawable);
v.setPadding(left, top, right, bottom);
}
@SuppressLint("NewApi")
public static void setBackgroundDrawable(View v, Drawable drawable){
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) v.setBackgroundDrawable(drawable);
else v.setBackground(drawable);
}
publicstaticvoid setbackgroundresourceandpadding(视图v,int-resourceId){
int top=v.getPaddingTop();
int left=v.getPaddingLeft();
int right=v.getPaddingRight();
int bottom=v.getPaddingBottom();
v、 挫折资源(resourceId);
v、 设置填充(左、上、右、下);
}
公共静态空间后退地面可绘制和保留添加(视图v,可绘制){
int top=v.getPaddingTop();
int left=v.getPaddingLeft();
int right=v.getPaddingRight();
int bottom=v.getPaddingBottom();
可拉拔立根(v,可拉拔);
v、 设置填充(左、上、右、下);
}
@SuppressLint(“新API”)
公共静态空间后退地面可绘制(视图v,可绘制){
if(android.os.Build.VERSION.SDK_INT
调用这些setBackgroundResourceAndKeepPadding()方法中的任何一个都可以避免您遇到的填充丢失问题
但是,这是假设您在设置背景图像之前设置了填充;否则,你的新填充物(看起来是5px)将接管。如果也是这样,您可能希望确保这不是您遇到的问题的一部分,因为高分辨率设备上的5px看起来几乎不存在 抱歉,我是一个初学者我实现了你的代码,坐在那里告诉我从未使用过setbackgroundresource和keepadding方法,我在声明它时遇到困难我需要在哪里声明方法才能将它应用到视图?谢谢,它们是静态方法,可以在应用程序中的任何位置随时使用。假设它们是名为ViewHelper的类的一部分,然后您可以访问其中一个,如:ViewHelper.setBackgroundResourceAndKeepPadding(v,R.drawable.icon);