我的主屏是1920*1080,副屏1920*720,副屏放进去1920*720的背景图是正确的,没有形变,说明是正确的分辨率。
但是放入控件时,位置和大小跟预览的都不一样,各种dpi都试过了,就是没一个对的。
甚至正方形的控件120dp * 120dp都变成了长方形。有大佬用过知道这个坑吗?求解
9.30补充(比较忙没登)
有跟一些安卓厂家聊过,就是按照主屏分辨率这种就是会压缩,就像电脑1920*1080接入到1920*720的屏一样会压缩,需要根据比例调节,预览无效。


下面是双屏部分代码,是比较简单的,就是两个屏不同分辨率导致与蓝图不符
xml:
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/secondary_display_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_three">
</androidx.constraintlayout.widget.ConstraintLayout>
public class SecondaryDisplay extends Presentation {
public static final String TAG = "SecondaryDisplay";
private Context parent;
private LifecycleOwner owner;
SecondaryDisplayScreenBinding b;
public SecondaryDisplay(Context outerContext, Display display, LifecycleOwner owner) {
super(outerContext,display);
parent = outerContext;
this.owner = owner;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
b = DataBindingUtil.inflate(LayoutInflater.from(getContext()), R.layout.secondary_display_screen, null, false);
setContentView(b.getRoot());
initBg();
initEvent();
b.secondaryDisplayBg.setOnClickListener(v -> {
Log.d(TAG, "Click");
});
}
private void initBg() {
//副屏皮肤刷新
LiveSkin.observe(owner, (observable, o) -> {
//b.secondaryDisplayBg.setBackgroundColor(SkinSet.getBgColor(parent));
});
}
private void initEvent() {
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart: ");
Log.d(TAG, "onStart: getResources: " + getResources().getDisplayMetrics());
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop: ");
}
@Override
public void show() {
if (!isConfigurationStillValid()){
Log.e(TAG, "show: Display DisplayMetrics not Equal to Resources DisplayMetrics!!!", null);
cloneDisplayMetrics();
}
super.show();
// if (getWindow() != null) {
//// getWindow().setBackgroundDrawableResource(android.R.color.transparent);
// getWindow().setLayout(1920, 720);
// }
}
public void secondScreenRefresh() {
if (!isShowing()) return;
//副屏状态刷新
}
public boolean isConfigurationStillValid() {
DisplayMetrics dm = new DisplayMetrics();
getDisplay().getMetrics(dm);
Log.d(TAG, "check: Display DisplayMetrics "+ dm.toString());
Log.d(TAG, "check: Resources DisplayMetrics "+ getContext().getResources().getDisplayMetrics());
// Log.d(TAG, "check: Is they equal ? "+ dm.equals(context.getResources().getDisplayMetrics()));
return dm.equals(getContext().getResources().getDisplayMetrics());
}
private void cloneDisplayMetrics() {
//解决副屏参数更改导致的presentation dismiss
//设置之后可能导致分辨率问题
DisplayMetrics dm = new DisplayMetrics();
getDisplay().getMetrics(dm);
getResources().getDisplayMetrics().setTo(dm);
}
}
在你的 Presentation 或副屏 Activity 里输出一下以下的日志看看?
DisplayMetrics metrics = new DisplayMetrics(); display.getMetrics(metrics); Log.d("DualScreen", "副屏 densityDpi=" + metrics.densityDpi + " widthPixels=" + metrics.widthPixels + " heightPixels=" + metrics.heightPixels + " density=" + metrics.density);如果是dpi的问题,可以在你的Presentation修改一下上下文的dpi,dpi影响dp转实际的px
private Context createFixedContext(Context outerContext, Display display) { DisplayMetrics dm = new DisplayMetrics(); display.getMetrics(dm); Resources res = outerContext.getResources(); Configuration config = res.getConfiguration(); // clone 一份 DisplayMetrics newMetrics = new DisplayMetrics(); newMetrics.setTo(dm); // 替换 density,让 dp 正常换算 float density = (float) dm.widthPixels / 1920f; // 1920 是你的设计稿宽度 newMetrics.density = density; newMetrics.scaledDensity = density; newMetrics.densityDpi = (int) (density * 160); Resources newRes = new Resources(res.getAssets(), newMetrics, config); return new ContextWrapper(outerContext) { @Override public Resources getResources() { return newRes; } }; }调用一下:
public SecondaryDisplay(Context outerContext, Display display, LifecycleOwner owner) { super(createFixedContext(outerContext, display), display); this.parent = outerContext; this.owner = owner; }没做过双屏的,你可以贴一下代码和图片吗?图片上传点击上传按钮。不要直接粘贴。