20251204_002634_939
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Wed Dec 03 13:18:48 GMT 2025
|
#Wed Dec 03 16:25:43 GMT 2025
|
||||||
stageCount=13
|
stageCount=13
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=15.11
|
baseVersion=15.11
|
||||||
publishVersion=15.11.12
|
publishVersion=15.11.12
|
||||||
buildCount=140
|
buildCount=158
|
||||||
baseBetaVersion=15.11.13
|
baseBetaVersion=15.11.13
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ public class BackgroundView extends RelativeLayout {
|
|||||||
|
|
||||||
// 上下文对象(全局复用)
|
// 上下文对象(全局复用)
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private LinearLayout mllMain;
|
private RelativeLayout mrlMain;
|
||||||
// 背景图片显示控件(核心子View)
|
// 背景图片显示控件(核心子View)
|
||||||
private ImageView mivBackground;
|
private ImageView mivBackground;
|
||||||
// 背景资源工具类(单例实例,避免重复创建)
|
// 背景资源工具类(单例实例,避免重复创建)
|
||||||
@@ -98,7 +98,7 @@ public class BackgroundView extends RelativeLayout {
|
|||||||
*/
|
*/
|
||||||
private void initView() {
|
private void initView() {
|
||||||
LogUtils.d(TAG, "=== initView(视图初始化)启动 ===");
|
LogUtils.d(TAG, "=== initView(视图初始化)启动 ===");
|
||||||
|
|
||||||
//mllMain = inflate(mContext, R.layout.view_background, null);
|
//mllMain = inflate(mContext, R.layout.view_background, null);
|
||||||
// mllMain.setBackgroundColor(0x00000000); // 全透明背景(ARGB:透明通道+黑色,无视觉影响)
|
// mllMain.setBackgroundColor(0x00000000); // 全透明背景(ARGB:透明通道+黑色,无视觉影响)
|
||||||
// mllMain.setBackground(new ColorDrawable(0x00000000)); // 双重保障:兼容Android低版本,确保背景透明
|
// mllMain.setBackground(new ColorDrawable(0x00000000)); // 双重保障:兼容Android低版本,确保背景透明
|
||||||
@@ -126,11 +126,11 @@ public class BackgroundView extends RelativeLayout {
|
|||||||
*/
|
*/
|
||||||
private void initBackgroundImageView() {
|
private void initBackgroundImageView() {
|
||||||
LogUtils.d(TAG, "=== initBackgroundImageView(内部ImageView初始化)启动 ===");
|
LogUtils.d(TAG, "=== initBackgroundImageView(内部ImageView初始化)启动 ===");
|
||||||
mllMain = (LinearLayout)inflate(mContext, R.layout.view_background, null);
|
mrlMain = (RelativeLayout)inflate(mContext, R.layout.view_background, null);
|
||||||
mllMain.setBackgroundColor(0x00000000); // 全透明背景(ARGB:透明通道+黑色,无视觉影响)
|
mrlMain.setBackgroundColor(0x00000000); // 全透明背景(ARGB:透明通道+黑色,无视觉影响)
|
||||||
mllMain.setBackground(new ColorDrawable(0x00000000)); // 双重保障:兼容Android低版本,确保背景透明
|
mrlMain.setBackground(new ColorDrawable(0x00000000)); // 双重保障:兼容Android低版本,确保背景透明
|
||||||
|
|
||||||
mivBackground = mllMain.findViewById(R.id.bg_imageview);
|
mivBackground = mrlMain.findViewById(R.id.bg_imageview);
|
||||||
//mivBackground = new ImageView(mContext);
|
//mivBackground = new ImageView(mContext);
|
||||||
// 配置ImageView布局参数:宽高自适应 + 居中显示 + 无内边距/外边距
|
// 配置ImageView布局参数:宽高自适应 + 居中显示 + 无内边距/外边距
|
||||||
// RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
|
// RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
|
||||||
@@ -140,13 +140,13 @@ public class BackgroundView extends RelativeLayout {
|
|||||||
// mivBackground.setLayoutParams(layoutParams);
|
// mivBackground.setLayoutParams(layoutParams);
|
||||||
|
|
||||||
// 配置ImageView显示属性:保持比例 + 全透明背景
|
// 配置ImageView显示属性:保持比例 + 全透明背景
|
||||||
mivBackground.setScaleType(ImageView.ScaleType.FIT_CENTER); // 缩放模式:保持比例,完整显示图片
|
// mivBackground.setScaleType(ImageView.ScaleType.FIT_CENTER); // 缩放模式:保持比例,完整显示图片
|
||||||
//mivBackground.setPadding(0, 0, 0, 0); // 取消内边距,避免图片与ImageView间出现缝隙
|
// mivBackground.setPadding(0, 0, 0, 0); // 取消内边距,避免图片与ImageView间出现缝隙
|
||||||
//mivBackground.setBackgroundColor(0x00000000); // ImageView自身背景全透明
|
// mivBackground.setBackgroundColor(0x00000000); // ImageView自身背景全透明
|
||||||
//mivBackground.setBackground(new ColorDrawable(0x00000000)); // 低版本兼容,确保透明
|
// mivBackground.setBackground(new ColorDrawable(0x00000000)); // 低版本兼容,确保透明
|
||||||
|
|
||||||
// 将ImageView添加到当前控件(父容器)
|
// 将ImageView添加到当前控件(父容器)
|
||||||
this.addView(mllMain);
|
this.addView(mrlMain);
|
||||||
LogUtils.d(TAG, "=== initBackgroundImageView(内部ImageView初始化)完成 ===");
|
LogUtils.d(TAG, "=== initBackgroundImageView(内部ImageView初始化)完成 ===");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,62 +168,9 @@ public class BackgroundView extends RelativeLayout {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 加载背景图片路径
|
// 加载背景图片路径
|
||||||
String szBackgroundPath = backgroundBean.isUseBackgroundScaledCompressFile()? backgroundBean.getBackgroundScaledCompressFilePath() : backgroundBean.getBackgroundFilePath();
|
String szBackgroundPath = backgroundBean.isUseBackgroundScaledCompressFile() ? backgroundBean.getBackgroundScaledCompressFilePath() : backgroundBean.getBackgroundFilePath();
|
||||||
File szBackgroundFile = checkFileValidity(szBackgroundPath); // 校验压缩图文件有效性
|
loadAndSetImageViewBackground(szBackgroundPath);
|
||||||
if (szBackgroundFile != null) {
|
LogUtils.d(TAG, "=== loadBackground 加载背景完成===");
|
||||||
loadAndSetImageViewBackground(szBackgroundPath);
|
|
||||||
LogUtils.d(TAG, "=== loadBackground 加载背景完成===");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. 压缩图和原图均无效时,显示默认透明背景
|
|
||||||
LogUtils.e(TAG, "【loadBackground】压缩图和原图均无效,显示默认背景");
|
|
||||||
setDefaultBackground();
|
|
||||||
LogUtils.d(TAG, "=== loadBackground(重新加载预览背景)完成(显示默认背景)===");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 校验图片文件有效性(路径非空+文件存在+是文件+大小>100bytes)
|
|
||||||
* 统一校验逻辑,避免重复代码
|
|
||||||
* @param filePath 待校验的图片路径
|
|
||||||
* @return 有效则返回File对象,无效则返回null
|
|
||||||
*/
|
|
||||||
@Nullable
|
|
||||||
private File checkFileValidity(String filePath) {
|
|
||||||
LogUtils.d(TAG, "=== checkFileValidity(文件有效性校验)启动 ===");
|
|
||||||
// 1. 校验路径是否为空
|
|
||||||
if (TextUtils.isEmpty(filePath)) {
|
|
||||||
LogUtils.w(TAG, "【checkFileValidity】校验失败:图片路径为空");
|
|
||||||
LogUtils.d(TAG, "=== checkFileValidity(文件有效性校验)完成(路径为空)===");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
File file = new File(filePath);
|
|
||||||
// 2. 校验文件是否存在
|
|
||||||
if (!file.exists()) {
|
|
||||||
LogUtils.w(TAG, "【checkFileValidity】校验失败:文件不存在,路径:" + filePath);
|
|
||||||
LogUtils.d(TAG, "=== checkFileValidity(文件有效性校验)完成(文件不存在)===");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. 校验是否为文件(避免是文件夹)
|
|
||||||
if (!file.isFile()) {
|
|
||||||
LogUtils.w(TAG, "【checkFileValidity】校验失败:不是文件,路径:" + filePath);
|
|
||||||
LogUtils.d(TAG, "=== checkFileValidity(文件有效性校验)完成(不是文件)===");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4. 校验文件大小(>100bytes视为有效,避免空文件)
|
|
||||||
if (file.length() <= 100) {
|
|
||||||
LogUtils.w(TAG, "【checkFileValidity】校验失败:文件过小(无效),路径:" + filePath + ",大小:" + file.length() + "bytes");
|
|
||||||
LogUtils.d(TAG, "=== checkFileValidity(文件有效性校验)完成(文件过小)===");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 所有校验通过,文件有效
|
|
||||||
LogUtils.d(TAG, "【checkFileValidity】校验成功:文件有效,路径:" + filePath + ",大小:" + file.length() + "bytes");
|
|
||||||
LogUtils.d(TAG, "=== checkFileValidity(文件有效性校验)完成(校验通过)===");
|
|
||||||
return file;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -339,56 +286,66 @@ public class BackgroundView extends RelativeLayout {
|
|||||||
* 适配场景:控件初始化、图片加载后、父容器尺寸变化(如屏幕旋转)
|
* 适配场景:控件初始化、图片加载后、父容器尺寸变化(如屏幕旋转)
|
||||||
*/
|
*/
|
||||||
private void adjustImageViewSize() {
|
private void adjustImageViewSize() {
|
||||||
//LogUtils.d(TAG, "=== adjustImageViewSize(调整ImageView尺寸)启动 ===");
|
LogUtils.d(TAG, "=== adjustImageViewSize(调整ImageView尺寸)启动 ===");
|
||||||
// 获取当前控件尺寸(已完全填充父视图,即父容器尺寸)
|
// 1. 绑定布局控件(匹配xml中bg_main容器和bg_imageview)
|
||||||
int parentWidth = getWidth();
|
if (mrlMain == null || mivBackground == null) {
|
||||||
int parentHeight = getHeight();
|
LogUtils.e(TAG, "【调整失败】布局控件绑定失败:bg_main或bg_imageview为空");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 父容器未测量完成(宽/高为0),延迟调整(避免尺寸计算错误)
|
// 2. 获取根容器bg_main尺寸(以bg_main为基准,实现居中平铺)
|
||||||
if (parentWidth == 0 || parentHeight == 0) {
|
int parentWidth = mrlMain.getWidth();
|
||||||
post(new Runnable() {
|
int parentHeight = mrlMain.getHeight();
|
||||||
|
|
||||||
|
// 3. bg_main未测量完成(宽/高为0),延迟调整(避免尺寸计算错误)
|
||||||
|
if (parentWidth == 0 || parentHeight == 0) {
|
||||||
|
postDelayed(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
adjustImageViewSize(); // 延迟后重新调整
|
adjustImageViewSize(); // 延迟后重新调整
|
||||||
}
|
}
|
||||||
});
|
}, 10); // 10ms延迟,平衡响应速度与测量稳定性
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化ImageView目标宽高
|
// 4. 初始化ImageView目标宽高(核心:严格保持原图宽高比,适配bg_main居中平铺)
|
||||||
int imageViewWidth, imageViewHeight;
|
int imageViewWidth, imageViewHeight;
|
||||||
|
float imageRatio = mnImageAspectRatio; // 原图宽高比(宽/高,确保比例不变)
|
||||||
|
float parentRatio = (float) parentWidth / parentHeight; // bg_main容器宽高比(宽/高)
|
||||||
|
|
||||||
// 核心逻辑:按图片宽高比计算ImageView尺寸(确保不拉伸)
|
// 关键逻辑:按比例计算ImageView最大尺寸(完整显示图片+适配bg_main+无拉伸)
|
||||||
if (mnImageAspectRatio >= 1.0f) { // 横图(宽 ≥ 高):优先填满父控件宽度
|
if (imageRatio >= parentRatio) {
|
||||||
imageViewWidth = parentWidth; // ImageView宽度 = 父控件宽度(填满)
|
// 情况1:原图比bg_main更宽(横图)→ 按bg_main宽度缩放,高度按原图比例适配(横向填满,纵向不超出)
|
||||||
imageViewHeight = Math.round(imageViewWidth / mnImageAspectRatio); // 高度按比例计算
|
imageViewWidth = parentWidth; // 宽度=bg_main宽度(横向平铺填满)
|
||||||
// 若计算出的高度超过父控件高度,按父控件高度重新计算(确保完全显示在父控件内)
|
imageViewHeight = Math.round(imageViewWidth / imageRatio); // 高度按原图比例计算
|
||||||
if (imageViewHeight > parentHeight) {
|
} else {
|
||||||
imageViewHeight = parentHeight;
|
// 情况2:原图比bg_main更高(竖图)→ 按bg_main高度缩放,宽度按原图比例适配(纵向填满,横向不超出)
|
||||||
imageViewWidth = Math.round(imageViewHeight * mnImageAspectRatio);
|
imageViewHeight = parentHeight; // 高度=bg_main高度(纵向平铺填满)
|
||||||
}
|
imageViewWidth = Math.round(imageViewHeight * imageRatio); // 宽度按原图比例计算
|
||||||
} else { // 竖图(宽 < 高):优先填满父控件高度
|
}
|
||||||
imageViewHeight = parentHeight; // ImageView高度 = 父控件高度(填满)
|
|
||||||
imageViewWidth = Math.round(imageViewHeight * mnImageAspectRatio); // 宽度按比例计算
|
|
||||||
// 若计算出的宽度超过父控件宽度,按父控件宽度重新计算
|
|
||||||
if (imageViewWidth > parentWidth) {
|
|
||||||
imageViewWidth = parentWidth;
|
|
||||||
imageViewHeight = Math.round(imageViewWidth / mnImageAspectRatio);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 应用计算出的尺寸到ImageView(更新布局参数)
|
// 5. 应用尺寸到ImageView(匹配xml布局参数,确保居中)
|
||||||
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mivBackground.getLayoutParams();
|
// 适配xml中RelativeLayout的LayoutParams(与布局文件根容器一致)
|
||||||
layoutParams.width = imageViewWidth;
|
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mivBackground.getLayoutParams();
|
||||||
layoutParams.height = imageViewHeight;
|
layoutParams.width = imageViewWidth; // 按比例计算的宽度(适配bg_main)
|
||||||
mivBackground.setLayoutParams(layoutParams);
|
layoutParams.height = imageViewHeight; // 按比例计算的高度(适配bg_main)
|
||||||
|
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); // 强制居中(匹配需求:图片在bg_main中居中)
|
||||||
|
mivBackground.setLayoutParams(layoutParams);
|
||||||
|
|
||||||
LogUtils.d(TAG, "【adjustImageViewSize】尺寸调整成功");
|
// 6. 关键:设置缩放模式(匹配xml布局+保持比例+居中平铺)
|
||||||
LogUtils.d(TAG, "→ 父控件尺寸:" + parentWidth + "x" + parentHeight);
|
mivBackground.setScaleType(ImageView.ScaleType.FIT_CENTER);
|
||||||
LogUtils.d(TAG, "→ ImageView调整后尺寸:" + imageViewWidth + "x" + imageViewHeight);
|
// 确保ImageView背景透明(避免遮挡,适配布局视觉效果)
|
||||||
LogUtils.d(TAG, "→ 图片宽高比:" + mnImageAspectRatio);
|
mivBackground.setBackgroundColor(0x00000000);
|
||||||
LogUtils.d(TAG, "=== adjustImageViewSize(调整ImageView尺寸)完成(调整成功)===");
|
LogUtils.d(TAG, "【适配布局】设置FIT_CENTER缩放模式+透明背景,匹配xml布局的居中平铺需求");
|
||||||
}
|
|
||||||
|
// 7. 日志验证(确保比例一致+适配成功)
|
||||||
|
LogUtils.d(TAG, "【adjustImageViewSize】尺寸调整成功(适配bg_main布局,保持原图比例+居中平铺)");
|
||||||
|
LogUtils.d(TAG, "→ bg_main容器尺寸:" + parentWidth + "x" + parentHeight);
|
||||||
|
LogUtils.d(TAG, "→ bg_imageview调整后尺寸:" + imageViewWidth + "x" + imageViewHeight);
|
||||||
|
LogUtils.d(TAG, "→ 原图宽高比:" + mnImageAspectRatio + ",调整后宽高比:" + (float)imageViewWidth/imageViewHeight); // 验证比例无变形
|
||||||
|
LogUtils.d(TAG, "=== adjustImageViewSize(调整ImageView尺寸)完成(调整成功)===");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 带压缩的Bitmap解码(通用方法)
|
* 带压缩的Bitmap解码(通用方法)
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout
|
<RelativeLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:orientation="vertical"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:id="@+id/bg_main">
|
android:id="@+id/bg_main">
|
||||||
@@ -11,5 +10,5 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:id="@+id/bg_imageview"/>
|
android:id="@+id/bg_imageview"/>
|
||||||
|
|
||||||
</LinearLayout>
|
</RelativeLayout>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user