android 在圆形卡片视图中设置图像
android set image in rounded cardview
我正在使用 DialogFragment
在 CardView
中显示图像,但我没有像预期的那样获得完整图像。
这是屏幕短片 how I'm getting image。我该如何填写 space.
这是我的代码
public class dlgProfile extends DialogFragment {
MainActivity _main;
private MainActivity context;
private TextView txtBenutzerName;
private TextView txtName;
private TextView txtAdresse;
private TextView txtTaetigkeit;
private BlurredImageView ivProfile;
private final String TAG = "fragprofile";
private Question q;
private Answer a;
private TextView txtID;
private Long BenutzerID;
private String BenutzerName;
private TextView btnPhone;
private TextView btnEMail;
CircleImageView cvImg;
private ImageView btnWhatsApp;
private MainActivity.OnlineState onlineState = MainActivity.OnlineState.offline;
private TextView txtOnlineState;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (_main == null) _main = (MainActivity) getActivity();
context = _main;
View v = inflater.inflate(R.layout.fragprofile, container, false);
txtID = v.findViewById(R.id.txtID);
txtBenutzerName = v.findViewById(R.id.txtBenutzername);
txtName = v.findViewById(R.id.txtName);
txtAdresse = v.findViewById(R.id.txtAdresse);
txtTaetigkeit = v.findViewById(R.id.txtTaetigkeitsschwerpunkte);
txtOnlineState = v.findViewById(R.id.txtOnlineState);
ivProfile = v.findViewById(R.id.imgProfile);
cvImg = v.findViewById(R.id.imgProfile2);
btnPhone = (TextView) v.findViewById(R.id.btnPhone);
btnEMail = (TextView) v.findViewById(R.id.btnEMail);
btnWhatsApp = (ImageView) v.findViewById(R.id.btnWhatsApp);
if (this.BenutzerName != null) {
try {
setValues(this.BenutzerID, this.BenutzerName);
} catch (Throwable throwable) {
throwable.printStackTrace();
lib.ShowException(TAG, context, throwable, false);
}
}
getDialog().getWindow().setBackgroundDrawableResource(R.drawable.bg_round_corner);
return v;
}
void setValues(final Question q, final Answer a) throws Throwable {
JSONObject N;
if (a == null) {
this.onlineState = q.onlineState;
setValues(q.BenutzerID, q.Benutzername);
} else {
this.onlineState = a.onlineState;
setValues(a.BenutzerID, a.BenutzerName);
}
}
void setValues(Long BenutzerID, String Benutzername) throws Exception {
if (txtID == null) {
this.BenutzerID = BenutzerID;
this.BenutzerName = Benutzername;
return;
}
JSONObject N = _main.clsHTTPS.getUser(_main.getBenutzerID(), BenutzerID);
txtID.setText("" + BenutzerID);
txtBenutzerName.setText(Benutzername);
txtName.setText((N.isNull(VORNAME) ? "?" : N.getString(VORNAME)) + " " + (N.isNull(NAME) ? "?" : N.getString(NAME)));
txtAdresse.setVisibility(BenutzerID.longValue() == _main.getBenutzerID()
|| N.getBoolean("gewerblich") ? View.VISIBLE : View.GONE);
txtAdresse.setText((N.isNull("adresse") ? "" : N.getString("adresse")));
txtTaetigkeit.setVisibility(BenutzerID.longValue() == _main.getBenutzerID()
|| N.getBoolean("gewerblich") ? View.VISIBLE : View.GONE);
txtTaetigkeit.setText((N.isNull(TAETIGKEITSSCHWERPUNKTE) ? "" : N.getString(TAETIGKEITSSCHWERPUNKTE)));
txtOnlineState.setText(this.onlineState.getStateString());
Bitmap profile = null;
try {
String fname;
fname = ".JPG";
Bitmap in = _main.clsHTTPS.downloadProfileImage(this.getContext(), BenutzerID,
_main.user.getLong(Constants.id), Benutzername);
if (in != null) {
profile = in;
}
} catch (Throwable e) {
e.printStackTrace();
Log.i(TAG, null, e);
}
if (profile != null) {
ivProfile.setImageBitmap(profile);
}
if (profile != null) {
cvImg.setImageBitmap(profile);
}
final ContactVO contactVO = new ContactVO(N);
if (BenutzerID.longValue() != _main.getBenutzerID() && !contactVO.isBestaetigt()
&& contactVO.isLimindoUser() && (_main.clsHTTPS.AdminID == null || _main.clsHTTPS.AdminID == 0)) {
btnEMail.setVisibility(View.GONE);
btnPhone.setVisibility(View.GONE);
btnWhatsApp.setVisibility(View.GONE);
} else {
if (contactVO.getContactEmail().length() > 3) {
btnEMail.setTag(contactVO.getContactEmail());
btnEMail.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
String[] aEmailList = {contactVO.getContactEmail()};
//String aEmailCCList[] = { "user3@fakehost.com","user4@fakehost.com"};
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, aEmailList);
//emailIntent.putExtra(android.content.Intent.EXTRA_CC, aEmailCCList);
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "");
emailIntent.setType("text/plain");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "");
MainActivity.dontStop++;
context.startActivityForResult(emailIntent, MainActivity.RGLOBAL);
}
});
} else {
btnEMail.setVisibility(View.GONE);
}
if (contactVO.getContactNumber().length() > 3) {
btnPhone.setTag(contactVO.getContactNumber());
btnPhone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String phone = contactVO.getContactNumber();
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phone, null));
MainActivity.dontStop++;
startActivityForResult(intent, MainActivity.RGLOBAL);
}
});
btnWhatsApp.setTag(contactVO.getContactNumber());
btnWhatsApp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (contactVO.getContactNumber().length() > 0) {
String number = contactVO.getContactNumber();
number = number.replaceFirst("\+", "");
String message = "";
try {
String url = "https://api.whatsapp.com/send?phone=" + number;
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
MainActivity.dontStop++;
startActivityForResult(i, MainActivity.RGLOBAL);
} catch (Exception e) {
}
}
}
});
} else {
btnPhone.setVisibility(View.GONE);
btnWhatsApp.setVisibility(View.GONE);
}
}
}
}
这是我用来显示数据的卡片视图的可绘制对象bg_round_corner
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF" />
<corners android:radius="30dp" />
<padding
android:bottom="10dp"
android:left="10dp"
android:right="10dp"
android:top="10dp" />
</shape>
这是我的 xml imageview
<ru.egslava.blurredview.BlurredImageView
android:id="@+id/imgProfile"
android:layout_width="match_parent"
android:layout_height="200dp"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/vn_logo_c02"
app:downSampling="2"
app:keepOriginal="true"
app:layout_constraintTop_toTopOf="parent"
app:radius="0.9" />
我建议您尝试以编程方式或直接在布局 XML 文件中使用 View
的宽度和高度。
如果不行,请尝试在 ImageView
的不同 scaleType
之间交替,直到看到您正在寻找的结果;也许 fitCenter
或 fitXY
可以满足您的特定需求。
你有两个问题阻止你的图像到达卡片的最边缘。
1.围绕所有边缘填充
由于您的背景形状在所有四个边上都有填充,因此它将通过该填充插入所有内容。您的图像和卡片边缘之间会有间隙。
从可绘制对象 XML 中删除填充(或在将其作为背景可绘制对象的视图上将填充属性设置为 0dp
)将消除此间隙。然后,您需要为您的 TextView 和其他您仍希望有间隙的内容添加边距。
2。图片偏向左侧
- 设置
android:scaleType="centerCrop"
和android:adjustViewBounds="false"
。这会导致图像均匀放大,以便在图像和 ImageView 的边界之间不留间隙,并且不会扭曲纵横比。它将图像居中并裁剪掉“悬垂”在边缘的像素。
- 在 ImageView 上设置
android:layout_width="match_parent"
。这将要求它占据卡片的整个宽度。
- 在 ImageView 上设置
android:layout_height
。您在这里有两个选择,具体取决于您的目标:
wrap_content
将导致它将其高度设置为位图或可绘制对象的高度。这可能不会给你自己想要的东西,所以使用 android:adjustViewBounds="true"
使它缩放高度以保持图像的纵横比相对于宽度。
150dp
或其他固定高度。这可能就是您想要的,假设此处显示的图像具有相同的纵横比。
- 您可能不想将
scaleType="centerCrop"
和 "android:adjustViewBounds="true"
结合使用,因为这两种模式在概念上相互冲突。 centerCrop
表示“我接受我的边界由其他人确定,并将缩放我的内容以适应它,并裁剪其余部分”,而 adjustViewBounds
表示“我将更改我的边界以匹配我的内容的大小。"
我正在使用 DialogFragment
在 CardView
中显示图像,但我没有像预期的那样获得完整图像。
这是屏幕短片 how I'm getting image。我该如何填写 space.
这是我的代码
public class dlgProfile extends DialogFragment {
MainActivity _main;
private MainActivity context;
private TextView txtBenutzerName;
private TextView txtName;
private TextView txtAdresse;
private TextView txtTaetigkeit;
private BlurredImageView ivProfile;
private final String TAG = "fragprofile";
private Question q;
private Answer a;
private TextView txtID;
private Long BenutzerID;
private String BenutzerName;
private TextView btnPhone;
private TextView btnEMail;
CircleImageView cvImg;
private ImageView btnWhatsApp;
private MainActivity.OnlineState onlineState = MainActivity.OnlineState.offline;
private TextView txtOnlineState;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (_main == null) _main = (MainActivity) getActivity();
context = _main;
View v = inflater.inflate(R.layout.fragprofile, container, false);
txtID = v.findViewById(R.id.txtID);
txtBenutzerName = v.findViewById(R.id.txtBenutzername);
txtName = v.findViewById(R.id.txtName);
txtAdresse = v.findViewById(R.id.txtAdresse);
txtTaetigkeit = v.findViewById(R.id.txtTaetigkeitsschwerpunkte);
txtOnlineState = v.findViewById(R.id.txtOnlineState);
ivProfile = v.findViewById(R.id.imgProfile);
cvImg = v.findViewById(R.id.imgProfile2);
btnPhone = (TextView) v.findViewById(R.id.btnPhone);
btnEMail = (TextView) v.findViewById(R.id.btnEMail);
btnWhatsApp = (ImageView) v.findViewById(R.id.btnWhatsApp);
if (this.BenutzerName != null) {
try {
setValues(this.BenutzerID, this.BenutzerName);
} catch (Throwable throwable) {
throwable.printStackTrace();
lib.ShowException(TAG, context, throwable, false);
}
}
getDialog().getWindow().setBackgroundDrawableResource(R.drawable.bg_round_corner);
return v;
}
void setValues(final Question q, final Answer a) throws Throwable {
JSONObject N;
if (a == null) {
this.onlineState = q.onlineState;
setValues(q.BenutzerID, q.Benutzername);
} else {
this.onlineState = a.onlineState;
setValues(a.BenutzerID, a.BenutzerName);
}
}
void setValues(Long BenutzerID, String Benutzername) throws Exception {
if (txtID == null) {
this.BenutzerID = BenutzerID;
this.BenutzerName = Benutzername;
return;
}
JSONObject N = _main.clsHTTPS.getUser(_main.getBenutzerID(), BenutzerID);
txtID.setText("" + BenutzerID);
txtBenutzerName.setText(Benutzername);
txtName.setText((N.isNull(VORNAME) ? "?" : N.getString(VORNAME)) + " " + (N.isNull(NAME) ? "?" : N.getString(NAME)));
txtAdresse.setVisibility(BenutzerID.longValue() == _main.getBenutzerID()
|| N.getBoolean("gewerblich") ? View.VISIBLE : View.GONE);
txtAdresse.setText((N.isNull("adresse") ? "" : N.getString("adresse")));
txtTaetigkeit.setVisibility(BenutzerID.longValue() == _main.getBenutzerID()
|| N.getBoolean("gewerblich") ? View.VISIBLE : View.GONE);
txtTaetigkeit.setText((N.isNull(TAETIGKEITSSCHWERPUNKTE) ? "" : N.getString(TAETIGKEITSSCHWERPUNKTE)));
txtOnlineState.setText(this.onlineState.getStateString());
Bitmap profile = null;
try {
String fname;
fname = ".JPG";
Bitmap in = _main.clsHTTPS.downloadProfileImage(this.getContext(), BenutzerID,
_main.user.getLong(Constants.id), Benutzername);
if (in != null) {
profile = in;
}
} catch (Throwable e) {
e.printStackTrace();
Log.i(TAG, null, e);
}
if (profile != null) {
ivProfile.setImageBitmap(profile);
}
if (profile != null) {
cvImg.setImageBitmap(profile);
}
final ContactVO contactVO = new ContactVO(N);
if (BenutzerID.longValue() != _main.getBenutzerID() && !contactVO.isBestaetigt()
&& contactVO.isLimindoUser() && (_main.clsHTTPS.AdminID == null || _main.clsHTTPS.AdminID == 0)) {
btnEMail.setVisibility(View.GONE);
btnPhone.setVisibility(View.GONE);
btnWhatsApp.setVisibility(View.GONE);
} else {
if (contactVO.getContactEmail().length() > 3) {
btnEMail.setTag(contactVO.getContactEmail());
btnEMail.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
String[] aEmailList = {contactVO.getContactEmail()};
//String aEmailCCList[] = { "user3@fakehost.com","user4@fakehost.com"};
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, aEmailList);
//emailIntent.putExtra(android.content.Intent.EXTRA_CC, aEmailCCList);
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "");
emailIntent.setType("text/plain");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "");
MainActivity.dontStop++;
context.startActivityForResult(emailIntent, MainActivity.RGLOBAL);
}
});
} else {
btnEMail.setVisibility(View.GONE);
}
if (contactVO.getContactNumber().length() > 3) {
btnPhone.setTag(contactVO.getContactNumber());
btnPhone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String phone = contactVO.getContactNumber();
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phone, null));
MainActivity.dontStop++;
startActivityForResult(intent, MainActivity.RGLOBAL);
}
});
btnWhatsApp.setTag(contactVO.getContactNumber());
btnWhatsApp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (contactVO.getContactNumber().length() > 0) {
String number = contactVO.getContactNumber();
number = number.replaceFirst("\+", "");
String message = "";
try {
String url = "https://api.whatsapp.com/send?phone=" + number;
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
MainActivity.dontStop++;
startActivityForResult(i, MainActivity.RGLOBAL);
} catch (Exception e) {
}
}
}
});
} else {
btnPhone.setVisibility(View.GONE);
btnWhatsApp.setVisibility(View.GONE);
}
}
}
}
这是我用来显示数据的卡片视图的可绘制对象bg_round_corner
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF" />
<corners android:radius="30dp" />
<padding
android:bottom="10dp"
android:left="10dp"
android:right="10dp"
android:top="10dp" />
</shape>
这是我的 xml imageview
<ru.egslava.blurredview.BlurredImageView
android:id="@+id/imgProfile"
android:layout_width="match_parent"
android:layout_height="200dp"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/vn_logo_c02"
app:downSampling="2"
app:keepOriginal="true"
app:layout_constraintTop_toTopOf="parent"
app:radius="0.9" />
我建议您尝试以编程方式或直接在布局 XML 文件中使用 View
的宽度和高度。
如果不行,请尝试在 ImageView
的不同 scaleType
之间交替,直到看到您正在寻找的结果;也许 fitCenter
或 fitXY
可以满足您的特定需求。
你有两个问题阻止你的图像到达卡片的最边缘。
1.围绕所有边缘填充
由于您的背景形状在所有四个边上都有填充,因此它将通过该填充插入所有内容。您的图像和卡片边缘之间会有间隙。
从可绘制对象 XML 中删除填充(或在将其作为背景可绘制对象的视图上将填充属性设置为 0dp
)将消除此间隙。然后,您需要为您的 TextView 和其他您仍希望有间隙的内容添加边距。
2。图片偏向左侧
- 设置
android:scaleType="centerCrop"
和android:adjustViewBounds="false"
。这会导致图像均匀放大,以便在图像和 ImageView 的边界之间不留间隙,并且不会扭曲纵横比。它将图像居中并裁剪掉“悬垂”在边缘的像素。 - 在 ImageView 上设置
android:layout_width="match_parent"
。这将要求它占据卡片的整个宽度。 - 在 ImageView 上设置
android:layout_height
。您在这里有两个选择,具体取决于您的目标:wrap_content
将导致它将其高度设置为位图或可绘制对象的高度。这可能不会给你自己想要的东西,所以使用android:adjustViewBounds="true"
使它缩放高度以保持图像的纵横比相对于宽度。150dp
或其他固定高度。这可能就是您想要的,假设此处显示的图像具有相同的纵横比。
- 您可能不想将
scaleType="centerCrop"
和"android:adjustViewBounds="true"
结合使用,因为这两种模式在概念上相互冲突。centerCrop
表示“我接受我的边界由其他人确定,并将缩放我的内容以适应它,并裁剪其余部分”,而adjustViewBounds
表示“我将更改我的边界以匹配我的内容的大小。"