1.巡乐会头像的界面修改
This commit is contained in:
@@ -55,7 +55,7 @@ android {
|
|||||||
}
|
}
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
minifyEnabled false
|
minifyEnabled true
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
signingConfig signingConfigs.release
|
signingConfig signingConfigs.release
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ android {
|
|||||||
|
|
||||||
debug {
|
debug {
|
||||||
debuggable true
|
debuggable true
|
||||||
minifyEnabled false
|
minifyEnabled true
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
signingConfig signingConfigs.debug
|
signingConfig signingConfigs.debug
|
||||||
|
|
||||||
@@ -116,7 +116,7 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = '11'
|
jvmTarget = '17'
|
||||||
}
|
}
|
||||||
dexOptions {
|
dexOptions {
|
||||||
dexInProcess true
|
dexInProcess true
|
||||||
@@ -144,9 +144,13 @@ dependencies {
|
|||||||
implementation files('libs/logger-2.2.2-release.aar')
|
implementation files('libs/logger-2.2.2-release.aar')
|
||||||
implementation files('libs/main-2.2.3-release.aar')
|
implementation files('libs/main-2.2.3-release.aar')
|
||||||
|
|
||||||
|
implementation files('libs/WbCloudFaceLiveSdk-face-v6.6.2-8e4718fc.aar')
|
||||||
|
implementation files('libs/WbCloudNormal-v5.1.10-4e3e198.aar')
|
||||||
|
|
||||||
|
|
||||||
|
implementation(libs.arouter.api.v150)
|
||||||
|
//annotationProcessor
|
||||||
|
annotationProcessor libs.arouter.compiler
|
||||||
implementation project(':modulevocal') // 必须
|
implementation project(':modulevocal') // 必须
|
||||||
annotationProcessor project(':modulevocal') // 关键!
|
annotationProcessor project(':modulevocal') // 关键!
|
||||||
|
|
||||||
@@ -154,10 +158,6 @@ dependencies {
|
|||||||
api project(":moduleLogin")
|
api project(":moduleLogin")
|
||||||
implementation project(':modulemain')
|
implementation project(':modulemain')
|
||||||
|
|
||||||
implementation(libs.arouter.api.v150)
|
|
||||||
//annotationProcessor
|
|
||||||
annotationProcessor libs.arouter.compiler
|
|
||||||
|
|
||||||
//aar的名称,例如:WbCloudFaceLiveSdk-v6.0.0-1234567.aar,填入'WbCloudFaceLiveSdk-v6.0.0-1234567'
|
//aar的名称,例如:WbCloudFaceLiveSdk-v6.0.0-1234567.aar,填入'WbCloudFaceLiveSdk-v6.0.0-1234567'
|
||||||
// implementation(name: 'WbCloudFaceLiveSdk-face-v6.6.2-8e4718fc', ext: 'aar')
|
// implementation(name: 'WbCloudFaceLiveSdk-face-v6.6.2-8e4718fc', ext: 'aar')
|
||||||
////2. 云normal SDK,
|
////2. 云normal SDK,
|
||||||
|
|||||||
61788
app/proguard/mapping.txt
61788
app/proguard/mapping.txt
File diff suppressed because it is too large
Load Diff
@@ -201,6 +201,7 @@ public class ImageUtils {
|
|||||||
|
|
||||||
public static void loadRes(int path, ImageView mImageView) {
|
public static void loadRes(int path, ImageView mImageView) {
|
||||||
Glide.with(mImageView).load(path).diskCacheStrategy(DiskCacheStrategy.ALL).into(mImageView);
|
Glide.with(mImageView).load(path).diskCacheStrategy(DiskCacheStrategy.ALL).into(mImageView);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,17 +1,11 @@
|
|||||||
package com.xscm.moduleutil.view;
|
package com.xscm.moduleutil.view;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Bitmap;
|
import android.content.res.TypedArray;
|
||||||
import android.graphics.BitmapFactory;
|
|
||||||
import android.graphics.Canvas;
|
|
||||||
import android.graphics.Color;
|
|
||||||
import android.graphics.Paint;
|
|
||||||
import android.graphics.PorterDuff;
|
|
||||||
import android.graphics.PorterDuffXfermode;
|
|
||||||
import android.graphics.Rect;
|
|
||||||
import android.graphics.RectF;
|
|
||||||
import android.graphics.drawable.GradientDrawable;
|
import android.graphics.drawable.GradientDrawable;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.Gravity;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.RelativeLayout;
|
import android.widget.RelativeLayout;
|
||||||
@@ -19,232 +13,320 @@ import android.widget.TextView;
|
|||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import com.bumptech.glide.Glide;
|
|
||||||
import com.xscm.moduleutil.R;
|
import com.xscm.moduleutil.R;
|
||||||
import com.xscm.moduleutil.bean.UserInfo;
|
|
||||||
import com.xscm.moduleutil.bean.blindboxwheel.BlindBoxBean;
|
import com.xscm.moduleutil.bean.blindboxwheel.BlindBoxBean;
|
||||||
import com.xscm.moduleutil.utils.ImageUtils;
|
import com.xscm.moduleutil.utils.ImageUtils;
|
||||||
import com.xscm.moduleutil.widget.GifAvatarOvalView;
|
import com.xscm.moduleutil.widget.GifAvatarOvalView;
|
||||||
|
|
||||||
public class QXMeetUserView extends RelativeLayout {
|
public class QXMeetUserView extends RelativeLayout {
|
||||||
|
private static final String TAG = "QXMeetUserView";
|
||||||
|
|
||||||
private GifAvatarOvalView headerImageView;
|
private GifAvatarOvalView headerImageView; // 头像
|
||||||
private ImageView dressImageView;
|
private ImageView dressImageView; // 装饰图
|
||||||
private TextView tagLabel;
|
private TextView tagLabel; // 标签
|
||||||
private TextView nameLabel;
|
private TextView nameLabel; // 名称
|
||||||
|
|
||||||
private boolean isLuckUser;
|
// 布局属性变量
|
||||||
private Object model; // 这里用 Object 代替 QXUserModel
|
private int avatarSize; // 头像大小
|
||||||
|
private int dressSize; // 装饰图大小
|
||||||
|
private float nameTextSize; // 名字字体大小
|
||||||
|
private int nameTextColor; // 名字颜色
|
||||||
|
private float tagTextSize; // 标签字体大小
|
||||||
|
private int tagTextColor; // 标签颜色
|
||||||
|
private int tagMargin; // 标签与头像的水平间距
|
||||||
|
|
||||||
|
// 布局常量(dp)
|
||||||
|
private static final int DEFAULT_AVATAR_SIZE = 60; // 默认头像大小
|
||||||
|
private static final int DEFAULT_DRESS_SIZE = 70; // 默认装饰图大小
|
||||||
|
private static final float DEFAULT_NAME_TEXT_SIZE = 12; // 默认名字字体大小
|
||||||
|
private static final int DEFAULT_NAME_TEXT_COLOR = 0xFFFFFFFF; // 默认名字颜色
|
||||||
|
private static final float DEFAULT_TAG_TEXT_SIZE = 12; // 默认标签字体大小
|
||||||
|
private static final int DEFAULT_TAG_TEXT_COLOR = 0xFFFFE554; // 默认标签颜色
|
||||||
|
private static final int DEFAULT_TAG_MARGIN = 0; // 默认标签间距
|
||||||
|
private static final int NAME_MARGIN_TOP = 3; // 名字与标签间距
|
||||||
|
|
||||||
public QXMeetUserView(Context context) {
|
public QXMeetUserView(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
|
initAttrs(null);
|
||||||
initSubviews(context);
|
initSubviews(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
public QXMeetUserView(Context context, @Nullable AttributeSet attrs) {
|
public QXMeetUserView(Context context, @Nullable AttributeSet attrs) {
|
||||||
super(context, attrs);
|
super(context, attrs);
|
||||||
|
initAttrs(attrs);
|
||||||
initSubviews(context);
|
initSubviews(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
public QXMeetUserView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
|
public QXMeetUserView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
|
||||||
super(context, attrs, defStyleAttr);
|
super(context, attrs, defStyleAttr);
|
||||||
|
initAttrs(attrs);
|
||||||
initSubviews(context);
|
initSubviews(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 初始化自定义属性
|
||||||
|
private void initAttrs(AttributeSet attrs) {
|
||||||
|
if (attrs == null) {
|
||||||
|
// 设置默认值
|
||||||
|
avatarSize = dpToPx(DEFAULT_AVATAR_SIZE);
|
||||||
|
dressSize = dpToPx(DEFAULT_DRESS_SIZE);
|
||||||
|
nameTextSize = DEFAULT_NAME_TEXT_SIZE;
|
||||||
|
nameTextColor = DEFAULT_NAME_TEXT_COLOR;
|
||||||
|
tagTextSize = DEFAULT_TAG_TEXT_SIZE;
|
||||||
|
tagTextColor = DEFAULT_TAG_TEXT_COLOR;
|
||||||
|
tagMargin = dpToPx(DEFAULT_TAG_MARGIN);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从XML获取属性
|
||||||
|
TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.QXMeetUserView);
|
||||||
|
avatarSize = ta.getDimensionPixelSize(R.styleable.QXMeetUserView_avatarSize, dpToPx(DEFAULT_AVATAR_SIZE));
|
||||||
|
dressSize = ta.getDimensionPixelSize(R.styleable.QXMeetUserView_dressSize, dpToPx(DEFAULT_DRESS_SIZE));
|
||||||
|
nameTextSize = ta.getDimension(R.styleable.QXMeetUserView_nameTextSize, DEFAULT_NAME_TEXT_SIZE);
|
||||||
|
nameTextColor = ta.getColor(R.styleable.QXMeetUserView_nameTextColor, DEFAULT_NAME_TEXT_COLOR);
|
||||||
|
tagTextSize = ta.getDimension(R.styleable.QXMeetUserView_tagTextSize, DEFAULT_TAG_TEXT_SIZE);
|
||||||
|
tagTextColor = ta.getColor(R.styleable.QXMeetUserView_tagTextColor, DEFAULT_TAG_TEXT_COLOR);
|
||||||
|
tagMargin = ta.getDimensionPixelSize(R.styleable.QXMeetUserView_tagMargin, dpToPx(DEFAULT_TAG_MARGIN));
|
||||||
|
ta.recycle();
|
||||||
|
|
||||||
|
// 日志输出属性值,便于调试
|
||||||
|
Log.d(TAG, "属性初始化 - 头像大小: " + avatarSize + ", 装饰大小: " + dressSize);
|
||||||
|
}
|
||||||
|
|
||||||
private void initSubviews(Context context) {
|
private void initSubviews(Context context) {
|
||||||
setClipChildren(false);
|
setClipChildren(false);
|
||||||
setClipToPadding(false);
|
setClipToPadding(false);
|
||||||
|
setWillNotDraw(false);
|
||||||
|
// 为整个视图添加背景色,便于调试视图范围
|
||||||
|
// setBackgroundColor(0x0A000000); // 极浅灰色背景
|
||||||
|
|
||||||
// 创建头像图片视图
|
// 2. 头像(中间层)
|
||||||
headerImageView = new GifAvatarOvalView(context);
|
headerImageView = new GifAvatarOvalView(context);
|
||||||
headerImageView.setScaleType(ImageView.ScaleType.FIT_CENTER); // 添加这一行
|
headerImageView.setId(View.generateViewId());
|
||||||
// headerImageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
|
headerImageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
|
||||||
// headerImageView.setImageResource(R.mipmap.default_avatar);
|
// 设置强制背景色,确保即使资源加载失败也能看到
|
||||||
|
// headerImageView.setBackgroundColor(0x33FF0000); // 半透明红色
|
||||||
|
|
||||||
int headerSize = getMeasuredWidth() - dpToPx(18); // self.width-9*2
|
// 尝试加载默认头像资源
|
||||||
LayoutParams headerParams = new LayoutParams(headerSize, headerSize);
|
try {
|
||||||
headerParams.setMargins(0, 10, 0, 0);
|
int resId = R.mipmap.default_avatar;
|
||||||
headerParams.addRule(CENTER_IN_PARENT);
|
// headerImageView.setImageResource(resId);
|
||||||
// 将头像添加到装饰视图之上
|
Log.d(TAG, "尝试加载默认头像资源: " + resId);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e(TAG, "默认头像资源加载失败: " + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
LayoutParams headerParams = new LayoutParams(avatarSize, avatarSize);
|
||||||
|
headerParams.addRule(CENTER_IN_PARENT); // 头像在父容器居中
|
||||||
addView(headerImageView, headerParams);
|
addView(headerImageView, headerParams);
|
||||||
|
Log.d(TAG, "头像已添加到视图,大小: " + avatarSize + "x" + avatarSize);
|
||||||
|
|
||||||
// 创建装饰图片视图
|
|
||||||
|
|
||||||
|
// 1. 装饰图(底层)- 优先初始化确保在最底层
|
||||||
dressImageView = new ImageView(context);
|
dressImageView = new ImageView(context);
|
||||||
|
dressImageView.setId(View.generateViewId());
|
||||||
dressImageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
|
dressImageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
|
||||||
dressImageView.setImageResource(R.mipmap.xlh_image);
|
// 设置强制背景色,确保即使资源加载失败也能看到
|
||||||
|
/// dressImageView.setBackgroundColor(0x330000FF); // 半透明蓝色
|
||||||
|
|
||||||
LayoutParams dressParams = new LayoutParams(
|
// 尝试加载装饰图资源
|
||||||
LayoutParams.MATCH_PARENT,
|
try {
|
||||||
LayoutParams.MATCH_PARENT
|
int resId = R.mipmap.xlh_image;
|
||||||
);
|
dressImageView.setImageResource(resId);
|
||||||
|
Log.d(TAG, "尝试加载装饰图资源: " + resId);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e(TAG, "装饰图资源加载失败: " + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
LayoutParams dressParams = new LayoutParams(dressSize, dressSize);
|
||||||
|
dressParams.addRule(CENTER_HORIZONTAL);
|
||||||
|
dressParams.topMargin = dpToPx(5); // 稍微向下移动一点,确保可见
|
||||||
addView(dressImageView, dressParams);
|
addView(dressImageView, dressParams);
|
||||||
|
Log.d(TAG, "装饰图已添加到视图,大小: " + dressSize + "x" + dressSize);
|
||||||
|
|
||||||
// 创建标签标签
|
|
||||||
|
// 3. 标签(顶层,与头像底部平齐)
|
||||||
tagLabel = new TextView(context);
|
tagLabel = new TextView(context);
|
||||||
tagLabel.setTextColor(0xFFFFE554); // RGB16(0xFFE554)
|
tagLabel.setId(View.generateViewId());
|
||||||
tagLabel.setTextSize(12);
|
tagLabel.setTextColor(tagTextColor);
|
||||||
tagLabel.setGravity(android.view.Gravity.CENTER);
|
tagLabel.setTextSize(tagTextSize);
|
||||||
tagLabel.setBackground(getRoundedRectBackground(0xFF8D6F28, dpToPx(8))); // 默认房主背景色
|
tagLabel.setGravity(Gravity.CENTER);
|
||||||
|
tagLabel.setText("房主");
|
||||||
|
tagLabel.setBackground(getRoundedRectBackground(0xFF8D6F28, dpToPx(8)));
|
||||||
|
tagLabel.setPadding(dpToPx(6), 0, dpToPx(6), 0);
|
||||||
|
|
||||||
LayoutParams tagParams = new LayoutParams(dpToPx(45), dpToPx(16));
|
LayoutParams tagParams = new LayoutParams(LayoutParams.WRAP_CONTENT, dpToPx(16));
|
||||||
tagParams.addRule(CENTER_HORIZONTAL);
|
tagParams.addRule(CENTER_HORIZONTAL);
|
||||||
// 需要在测量完成后设置底部位置
|
|
||||||
addView(tagLabel, tagParams);
|
addView(tagLabel, tagParams);
|
||||||
|
|
||||||
// 创建名称标签
|
// 4. 名字(顶层,在标签下方)
|
||||||
nameLabel = new TextView(context);
|
nameLabel = new TextView(context);
|
||||||
nameLabel.setTextColor(0xFFFFFFFF); // RGB16(0xffffff)
|
nameLabel.setId(View.generateViewId());
|
||||||
nameLabel.setTextSize(12);
|
nameLabel.setTextColor(nameTextColor);
|
||||||
|
nameLabel.setTextSize(nameTextSize);
|
||||||
nameLabel.setText("虚位以待");
|
nameLabel.setText("虚位以待");
|
||||||
nameLabel.setGravity(android.view.Gravity.CENTER);
|
nameLabel.setGravity(Gravity.CENTER);
|
||||||
|
nameLabel.setSingleLine(true);
|
||||||
|
|
||||||
LayoutParams nameParams = new LayoutParams(
|
LayoutParams nameParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
|
||||||
LayoutParams.WRAP_CONTENT,
|
|
||||||
LayoutParams.WRAP_CONTENT
|
|
||||||
);
|
|
||||||
nameParams.addRule(CENTER_HORIZONTAL);
|
nameParams.addRule(CENTER_HORIZONTAL);
|
||||||
nameParams.addRule(ALIGN_PARENT_BOTTOM);
|
nameParams.addRule(BELOW, tagLabel.getId());
|
||||||
|
nameParams.topMargin = dpToPx(NAME_MARGIN_TOP);
|
||||||
addView(nameLabel, nameParams);
|
addView(nameLabel, nameParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
// 强制设置最小宽高,确保视图可见
|
||||||
|
int minWidth = Math.max(avatarSize, dressSize);
|
||||||
|
int minHeight = dressSize + dpToPx(40); // 装饰图高度 + 标签和名字的高度
|
||||||
|
|
||||||
// 确保在测量时设置正确的头像尺寸
|
int width = resolveSizeAndState(minWidth, widthMeasureSpec, 0);
|
||||||
if (headerImageView != null) {
|
int height = resolveSizeAndState(minHeight, heightMeasureSpec, 0);
|
||||||
int headerSize = getMeasuredWidth() - dpToPx(18); // width - 9dp * 2
|
|
||||||
LayoutParams headerParams = (LayoutParams) headerImageView.getLayoutParams();
|
setMeasuredDimension(width, height);
|
||||||
if (headerParams != null) {
|
|
||||||
headerParams.width = headerSize;
|
// 测量子视图
|
||||||
headerParams.height = headerSize;
|
measureChildren(
|
||||||
headerParams.leftMargin = dpToPx(9);
|
MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
|
||||||
headerParams.topMargin = dpToPx(9);
|
MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
|
||||||
headerImageView.setLayoutParams(headerParams);
|
);
|
||||||
}
|
|
||||||
}
|
Log.d(TAG, "onMeasure - 视图大小: " + width + "x" + height);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
||||||
super.onLayout(changed, l, t, r, b);
|
super.onLayout(changed, l, t, r, b);
|
||||||
|
|
||||||
// 在布局完成后设置标签的位置(在头像底部-8的位置)
|
// 确保装饰图正确布局
|
||||||
if (changed && headerImageView != null && tagLabel != null) {
|
if (dressImageView != null) {
|
||||||
int tagTop = headerImageView.getBottom() - dpToPx(8);
|
int dressLeft = (getWidth() - dressSize) / 2;
|
||||||
int tagLeft = (getWidth() - tagLabel.getWidth()) / 2;
|
int dressTop = dpToPx(5); // 顶部留出一点空间
|
||||||
tagLabel.layout(tagLeft, tagTop, tagLeft + tagLabel.getWidth(), tagTop + tagLabel.getHeight());
|
dressImageView.layout(
|
||||||
|
dressLeft,
|
||||||
|
dressTop,
|
||||||
|
dressLeft + dressSize,
|
||||||
|
dressTop + dressSize
|
||||||
|
);
|
||||||
|
Log.d(TAG, "装饰图布局位置: " + dressLeft + "," + dressTop + "," +
|
||||||
|
(dressLeft + dressSize) + "," + (dressTop + dressSize));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 确保头像正确布局
|
||||||
|
if (headerImageView != null) {
|
||||||
|
int avatarLeft = (getWidth() - avatarSize) / 2;
|
||||||
|
int avatarTop = (dressSize - avatarSize) / 2 + dpToPx(5); // 居中显示在装饰图上
|
||||||
|
headerImageView.layout(
|
||||||
|
avatarLeft,
|
||||||
|
avatarTop,
|
||||||
|
avatarLeft + avatarSize,
|
||||||
|
avatarTop + avatarSize
|
||||||
|
);
|
||||||
|
Log.d(TAG, "头像布局位置: " + avatarLeft + "," + avatarTop + "," +
|
||||||
|
(avatarLeft + avatarSize) + "," + (avatarTop + avatarSize));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 标签布局(与头像底部平齐)
|
||||||
|
if (headerImageView != null && tagLabel != null) {
|
||||||
|
int avatarBottom = headerImageView.getBottom();
|
||||||
|
int tagTop = avatarBottom + tagMargin;
|
||||||
|
int tagLeft = (getWidth() - tagLabel.getMeasuredWidth()) / 2;
|
||||||
|
|
||||||
|
tagLabel.layout(
|
||||||
|
tagLeft,
|
||||||
|
tagTop,
|
||||||
|
tagLeft + tagLabel.getMeasuredWidth(),
|
||||||
|
tagTop + tagLabel.getMeasuredHeight()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 名字布局(在标签下方)
|
||||||
|
if (tagLabel != null && nameLabel != null) {
|
||||||
|
int tagBottom = tagLabel.getBottom();
|
||||||
|
int nameTop = tagBottom + dpToPx(NAME_MARGIN_TOP);
|
||||||
|
int nameLeft = (getWidth() - nameLabel.getMeasuredWidth()) / 2;
|
||||||
|
|
||||||
|
nameLabel.layout(
|
||||||
|
nameLeft,
|
||||||
|
nameTop,
|
||||||
|
nameLeft + nameLabel.getMeasuredWidth(),
|
||||||
|
nameTop + nameLabel.getMeasuredHeight()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 以下方法保持不变
|
||||||
public void setIsLuckUser(boolean isLuckUser) {
|
public void setIsLuckUser(boolean isLuckUser) {
|
||||||
this.isLuckUser = isLuckUser;
|
if (tagLabel == null) return;
|
||||||
|
|
||||||
if (isLuckUser) {
|
if (isLuckUser) {
|
||||||
tagLabel.setTextColor(0xFFFFFFFF); // RGB16(0xffffff)
|
tagLabel.setTextColor(0xFFFFFFFF);
|
||||||
tagLabel.setBackground(getRoundedRectBackground(0xFF6C49E4, dpToPx(8))); // RGB16(0x6C49E4)
|
tagLabel.setBackground(getRoundedRectBackground(0xFF6C49E4, dpToPx(8)));
|
||||||
// tagLabel.setBackgroundColor(getResources().getColor(R.color.color_FF6C49E4)); // RGB16(0x6C49E4)
|
|
||||||
tagLabel.setText("幸运者");
|
tagLabel.setText("幸运者");
|
||||||
} else {
|
} else {
|
||||||
tagLabel.setTextColor(0xFFFFE554); // RGB16(0xFFE554)
|
tagLabel.setTextColor(tagTextColor);
|
||||||
tagLabel.setBackground(getRoundedRectBackground(0xFF8D6F28, dpToPx(8))); // RGB16(0x8D6F28)
|
tagLabel.setBackground(getRoundedRectBackground(0xFF8D6F28, dpToPx(8)));
|
||||||
// tagLabel.setBackgroundColor(getResources().getColor(R.color.color_FF8D6F28)); // RGB16(0x6C49E4)
|
|
||||||
|
|
||||||
tagLabel.setText("房主");
|
tagLabel.setText("房主");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setModel(BlindBoxBean.xlhUser model) {
|
public void setModel(BlindBoxBean.xlhUser model) {
|
||||||
this.model = model;
|
|
||||||
// 这里需要根据您的 QXUserModel 类来实现具体逻辑
|
|
||||||
if (model instanceof BlindBoxBean.xlhUser) {
|
|
||||||
BlindBoxBean.xlhUser userModel = (BlindBoxBean.xlhUser) model;
|
|
||||||
|
|
||||||
// 使用图片加载库加载头像
|
if (headerImageView == null || nameLabel == null) return;
|
||||||
// Glide.with(getContext()).load(userModel.getAvatar()).into(headerImageView);
|
|
||||||
ImageUtils.loadHeadCC(userModel.getAvatar(), headerImageView);
|
if (model != null) {
|
||||||
nameLabel.setText(userModel.getNickname());
|
try {
|
||||||
|
if (model.getAvatar().toString()!=""){
|
||||||
|
ImageUtils.loadHeadCC(model.getAvatar(), headerImageView);
|
||||||
|
}else {
|
||||||
|
int resId = R.mipmap.default_avatar;
|
||||||
|
headerImageView.setImageResource(resId);
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.d(TAG, "加载用户头像: " + model.getAvatar());
|
||||||
|
} catch (Exception e) {
|
||||||
|
int resId = R.mipmap.default_avatar;
|
||||||
|
headerImageView.setImageResource(resId);
|
||||||
|
Log.e(TAG, "加载用户头像失败: " + e.getMessage());
|
||||||
|
//headerImageView.setBackgroundColor(0x33FF0000); // 保持红色背景以便识别
|
||||||
|
}
|
||||||
|
nameLabel.setText(model.getNickname() != null ? model.getNickname() : "虚位以待");
|
||||||
|
} else {
|
||||||
|
resetView();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void resetView() {
|
public void resetView() {
|
||||||
|
if (headerImageView != null) {
|
||||||
|
try {
|
||||||
headerImageView.setImageResource(R.mipmap.default_avatar);
|
headerImageView.setImageResource(R.mipmap.default_avatar);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e(TAG, "重置头像失败: " + e.getMessage());
|
||||||
|
// headerImageView.setBackgroundColor(0x33FF0000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (nameLabel != null) {
|
||||||
nameLabel.setText("虚位以待");
|
nameLabel.setText("虚位以待");
|
||||||
}
|
}
|
||||||
|
setIsLuckUser(false);
|
||||||
|
}
|
||||||
|
|
||||||
// 创建圆角矩形背景
|
private GradientDrawable getRoundedRectBackground(int color, float radius) {
|
||||||
private android.graphics.drawable.Drawable getRoundedRectBackground(int color, float radius) {
|
|
||||||
GradientDrawable drawable = new GradientDrawable();
|
GradientDrawable drawable = new GradientDrawable();
|
||||||
drawable.setColor(color);
|
drawable.setColor(color);
|
||||||
drawable.setCornerRadius(radius);
|
drawable.setCornerRadius(radius);
|
||||||
return drawable;
|
return drawable;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 辅助方法:dp 转 px
|
|
||||||
private int dpToPx(int dp) {
|
private int dpToPx(int dp) {
|
||||||
float density = getResources().getDisplayMetrics().density;
|
float density = getResources().getDisplayMetrics().density;
|
||||||
return Math.round(dp * density);
|
return Math.round(dp * density);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Getter 方法
|
// Getter方法
|
||||||
public ImageView getHeaderImageView() {
|
public ImageView getHeaderImageView() { return headerImageView; }
|
||||||
return headerImageView;
|
public ImageView getDressImageView() { return dressImageView; }
|
||||||
}
|
public TextView getTagLabel() { return tagLabel; }
|
||||||
|
public TextView getNameLabel() { return nameLabel; }
|
||||||
public ImageView getDressImageView() {
|
|
||||||
return dressImageView;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextView getTagLabel() {
|
|
||||||
return tagLabel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextView getNameLabel() {
|
|
||||||
return nameLabel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isLuckUser() {
|
|
||||||
return isLuckUser;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Object getModel() {
|
|
||||||
return model;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 自定义圆形 ImageView
|
|
||||||
private static class RoundImageView extends androidx.appcompat.widget.AppCompatImageView {
|
|
||||||
public RoundImageView(Context context) {
|
|
||||||
super(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
public RoundImageView(Context context, @Nullable AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public RoundImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDraw(Canvas canvas) {
|
|
||||||
// 创建圆形裁剪区域
|
|
||||||
int diameter = Math.min(getWidth(), getHeight());
|
|
||||||
Bitmap bitmap = Bitmap.createBitmap(diameter, diameter, Bitmap.Config.ARGB_8888);
|
|
||||||
Canvas tempCanvas = new Canvas(bitmap);
|
|
||||||
|
|
||||||
// 绘制圆形
|
|
||||||
Paint paint = new Paint();
|
|
||||||
paint.setAntiAlias(true);
|
|
||||||
tempCanvas.drawCircle(diameter / 2f, diameter / 2f, diameter / 2f, paint);
|
|
||||||
|
|
||||||
// 设置混合模式
|
|
||||||
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
|
|
||||||
|
|
||||||
// 绘制原始图片
|
|
||||||
super.onDraw(tempCanvas);
|
|
||||||
|
|
||||||
// 将处理后的图片绘制到实际canvas
|
|
||||||
canvas.drawBitmap(bitmap, 0, 0, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.xscm.moduleutil.view;
|
package com.xscm.moduleutil.view;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.graphics.Typeface;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
|||||||
@@ -63,9 +63,12 @@
|
|||||||
|
|
||||||
|
|
||||||
<com.xscm.moduleutil.view.QXMeetUserView
|
<com.xscm.moduleutil.view.QXMeetUserView
|
||||||
|
app:avatarSize="@dimen/dp_40"
|
||||||
|
app:dressSize="@dimen/dp_60"
|
||||||
|
app:tagMargin="-2dp"
|
||||||
android:id="@+id/gv_fz"
|
android:id="@+id/gv_fz"
|
||||||
android:layout_width="@dimen/dp_60"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="@dimen/dp_83"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginEnd="@dimen/dp_11"
|
android:layout_marginEnd="@dimen/dp_11"
|
||||||
app:layout_constraintEnd_toStartOf="@+id/iv_zyx"
|
app:layout_constraintEnd_toStartOf="@+id/iv_zyx"
|
||||||
app:layout_constraintTop_toTopOf="@+id/iv_zyx"
|
app:layout_constraintTop_toTopOf="@+id/iv_zyx"
|
||||||
@@ -83,11 +86,22 @@
|
|||||||
android:scaleType="fitCenter"
|
android:scaleType="fitCenter"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
/>
|
/>
|
||||||
|
<TextView
|
||||||
|
android:textColor="#D1D6FF"
|
||||||
|
android:textSize="@dimen/sp_12"
|
||||||
|
android:translationY="@dimen/dp_98"
|
||||||
|
app:layout_constraintLeft_toLeftOf="@+id/iv_zyx"
|
||||||
|
app:layout_constraintRight_toRightOf="@+id/iv_zyx"
|
||||||
|
app:layout_constraintBottom_toTopOf="@+id/iv_zyx"
|
||||||
|
android:text="赠予"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"/>
|
||||||
|
|
||||||
<com.xscm.moduleutil.view.QXTimeDownView
|
<com.xscm.moduleutil.view.QXTimeDownView
|
||||||
|
android:layout_marginTop="@dimen/dp_30"
|
||||||
android:id="@+id/qx_djs"
|
android:id="@+id/qx_djs"
|
||||||
android:layout_width="@dimen/dp_88"
|
android:layout_width="@dimen/dp_88"
|
||||||
android:layout_height="@dimen/dp_98"
|
android:layout_height="@dimen/dp_88"
|
||||||
app:layout_constraintStart_toEndOf="@+id/gv_fz"
|
app:layout_constraintStart_toEndOf="@+id/gv_fz"
|
||||||
android:layout_marginStart="@dimen/dp_10"
|
android:layout_marginStart="@dimen/dp_10"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/iv_zyx"
|
app:layout_constraintTop_toBottomOf="@+id/iv_zyx"
|
||||||
@@ -95,12 +109,14 @@
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
<com.xscm.moduleutil.view.QXMeetUserView
|
<com.xscm.moduleutil.view.QXMeetUserView
|
||||||
|
app:tagMargin="-10dp"
|
||||||
|
app:avatarSize="@dimen/dp_60"
|
||||||
|
app:dressSize="@dimen/dp_84"
|
||||||
android:id="@+id/gv_xyz"
|
android:id="@+id/gv_xyz"
|
||||||
android:layout_width="@dimen/dp_94"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="@dimen/dp_118"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="@dimen/dp_21"
|
android:layout_marginTop="@dimen/dp_21"
|
||||||
app:layout_constraintEnd_toStartOf="@+id/iv_zyx"
|
app:layout_constraintEnd_toStartOf="@+id/iv_zyx"
|
||||||
android:layout_marginEnd="-13dp"
|
|
||||||
android:translationY="@dimen/dp_78"
|
android:translationY="@dimen/dp_78"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/gv_fz"
|
app:layout_constraintTop_toBottomOf="@+id/gv_fz"
|
||||||
/>
|
/>
|
||||||
@@ -119,6 +135,7 @@
|
|||||||
|
|
||||||
|
|
||||||
<com.xscm.moduleutil.view.QXMeetGiftView
|
<com.xscm.moduleutil.view.QXMeetGiftView
|
||||||
|
|
||||||
android:id="@+id/gv_fzlw"
|
android:id="@+id/gv_fzlw"
|
||||||
android:layout_width="@dimen/dp_48"
|
android:layout_width="@dimen/dp_48"
|
||||||
android:layout_height="@dimen/dp_76"
|
android:layout_height="@dimen/dp_76"
|
||||||
|
|||||||
@@ -470,6 +470,23 @@
|
|||||||
<attr name="normalBackground" format="reference" />
|
<attr name="normalBackground" format="reference" />
|
||||||
</declare-styleable>
|
</declare-styleable>
|
||||||
|
|
||||||
|
<declare-styleable name="QXMeetUserView">
|
||||||
|
<!-- 头像大小 -->
|
||||||
|
<attr name="avatarSize" format="dimension" />
|
||||||
|
<!-- 装饰图大小 -->
|
||||||
|
<attr name="dressSize" format="dimension" />
|
||||||
|
<!-- 名字字体大小 -->
|
||||||
|
<attr name="nameTextSize" format="dimension" />
|
||||||
|
<!-- 名字颜色 -->
|
||||||
|
<attr name="nameTextColor" format="color" />
|
||||||
|
<!-- 标签字体大小 -->
|
||||||
|
<attr name="tagTextSize" format="dimension" />
|
||||||
|
<!-- 标签颜色 -->
|
||||||
|
<attr name="tagTextColor" format="color" />
|
||||||
|
<!-- 标签与头像的水平间距 -->
|
||||||
|
<attr name="tagMargin" format="dimension" />
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
Reference in New Issue
Block a user