Skip to content

Commit

Permalink
[#615] image组件支持图片显示质量配置 (#617)
Browse files Browse the repository at this point in the history
  • Loading branch information
pf-pengfeng authored Nov 22, 2023
1 parent ee24382 commit 5946128
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Copyright (c) 2023, the hapjs-platform Project Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.hapjs.component;

import android.content.Context;

public interface ComponentProvider {
String NAME = "component";

/**
* Android O以下版本Bitmap是否默认RGB565
*
* @param context
* @return true: Android O以下版本Bitmap默认RGB565 false:Android O以下版本Bitmap默认ARGB8888
*/
boolean isDefaultRgb565EnableBelowAndroidO(Context context);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/*
* Copyright (c) 2023, the hapjs-platform Project Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.hapjs.component;

import android.content.Context;

public class DefaultComponentProviderImpl implements ComponentProvider {
@Override
public boolean isDefaultRgb565EnableBelowAndroidO(Context context) {
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,7 @@ public interface Style {
String SRC = "src";
String SOURCE = "source";
String ALT = "alt";
String QUALITY = "quality";

String INDEX = "index";
String AUTO_PLAY = "autoplay";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,10 @@ protected boolean setAttribute(String key, Object attribute) {
boolean autoplay = Attributes.getBoolean(attribute, true);
setAutoplay(autoplay);
return true;
case Attributes.Style.QUALITY:
String quality = Attributes.getString(attribute, "");
setQuality(quality);
return true;
default:
break;
}
Expand Down Expand Up @@ -653,6 +657,13 @@ public void setAutoplay(boolean autoplay) {
mHost.setAutoplay(autoplay);
}

public void setQuality(String quality) {
if (mHost == null) {
return;
}
mHost.setQuality(quality);
}

public void startAnimation() {
if (mHost == null) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
import com.facebook.drawee.view.AspectRatioMeasure;
import com.facebook.drawee.view.GenericDraweeView;
import com.facebook.fresco.animation.drawable.AnimatedDrawable2;
import com.facebook.imagepipeline.common.ImageDecodeOptions;
import com.facebook.imagepipeline.common.ResizeOptions;
import com.facebook.imagepipeline.common.RotationOptions;
import com.facebook.imagepipeline.core.ImagePipeline;
Expand All @@ -77,6 +78,7 @@
import org.hapjs.common.utils.SvgDecoderUtil;
import org.hapjs.common.utils.UriUtils;
import org.hapjs.component.Component;
import org.hapjs.component.ComponentProvider;
import org.hapjs.component.bridge.RenderEventCallback;
import org.hapjs.component.constants.Attributes;
import org.hapjs.component.constants.Corner;
Expand All @@ -92,6 +94,7 @@
import org.hapjs.render.RootView;
import org.hapjs.runtime.ConfigurationManager;
import org.hapjs.runtime.DarkThemeUtil;
import org.hapjs.runtime.ProviderManager;
import org.hapjs.widgets.Image;
import org.hapjs.widgets.R;

Expand All @@ -109,6 +112,8 @@ public class FlexImageView extends GenericDraweeView implements ComponentHost, G
private static final String TAG = "FlexImageView";
private static final String STRETCH = "stretch";
private static final String CENTER = "center";
private static final String QUALITY_HIGH = "high";
private static final String QUALITY_LOW = "low";
private final FlexImageViewAttach mViewAttach;
private final AbstractDraweeControllerBuilder mDraweeControllerBuilder;
private final RoundedCornerPostprocessor mRoundedCornerPostprocessor;
Expand Down Expand Up @@ -146,6 +151,7 @@ public class FlexImageView extends GenericDraweeView implements ComponentHost, G
private String mObjectFit;
private boolean mAltObjectFitHasApplied = false;
private boolean mAutoplay = true;
private String mQuality = QUALITY_HIGH;
private Animatable mAnimatable = null;
private boolean mIsStartAnimation = false;
private AutoplayManager mAutoplayManager;
Expand Down Expand Up @@ -175,6 +181,19 @@ public boolean onPreDraw() {
return true;
}
});
initBitmapQuality(context);
}

private void initBitmapQuality(Context context) {
ComponentProvider componentProvider = ProviderManager.getDefault()
.getProvider(ComponentProvider.NAME);
if (componentProvider != null && componentProvider.isDefaultRgb565EnableBelowAndroidO(context)) {
/*
* Android O以下版本Bitmap内存在Java堆上,有阈值限制。默认是RGB565,减少内存占用,降低OOM
* Android O及以上版本Bitmap内存在Native堆上,没有阈值限制。默认是ARGB8888
*/
mQuality = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? QUALITY_HIGH : QUALITY_LOW;
}
}

private static GenericDraweeHierarchy buildHierarchy(Context context) {
Expand Down Expand Up @@ -331,6 +350,10 @@ public String getSource() {
return null;
}

public void setQuality(String quality) {
mQuality = quality;
}

/**
* update placeholder image
*/
Expand Down Expand Up @@ -638,13 +661,18 @@ public void maybeUpdateView(boolean rebuild) {
&& mScaleType != ScalingUtils.ScaleType.CENTER;
ResizeOptions resizeOptions = doResize ? new ResizeOptions(width, height) : null;
RequestListener requestListener = new ImageSizeDetectRequestListener();
Bitmap.Config config = QUALITY_LOW.equals(mQuality) ?
Bitmap.Config.RGB_565 : Bitmap.Config.ARGB_8888;
ImageRequest imageRequest =
ImageRequestBuilder.newBuilderWithSource(mSource)
.setPostprocessor(postprocessor)
.setResizeOptions(resizeOptions)
.setRotationOptions(RotationOptions.autoRotate())
.setProgressiveRenderingEnabled(mProgressiveRenderingEnabled)
.setRequestListener(requestListener)
.setImageDecodeOptions(ImageDecodeOptions.newBuilder()
.setBitmapConfig(config)
.build())
.build();

final boolean supportLargeImage = shouldSupportLargeImage();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@
import org.hapjs.common.net.DefaultNetworkReportProviderImpl;
import org.hapjs.common.net.NetworkReportProvider;
import org.hapjs.common.utils.ProcessUtils;
import org.hapjs.component.ComponentProvider;
import org.hapjs.component.DefaultComponentProviderImpl;
import org.hapjs.distribution.InstalledSubpackageManager;
import org.hapjs.launch.DeepLinkClient;
import org.hapjs.launch.LauncherManager;
Expand Down Expand Up @@ -126,6 +128,8 @@ protected void onAllProcessInit() {
NetworkReportProvider.NAME, new DefaultNetworkReportProviderImpl(mContext));
ProviderManager.getDefault().addProvider(
CommonMsgProvider.NAME, new DefaultCommonMsgProviderImpl());
ProviderManager.getDefault().addProvider(
ComponentProvider.NAME, new DefaultComponentProviderImpl());
Thread.setDefaultUncaughtExceptionHandler(new CrashHandler());
}

Expand Down

0 comments on commit 5946128

Please sign in to comment.