0

我的活动有一个 1280x800 像素的背景图像。我使用android:scaleType="centerCrop".

背景图像上有一个旗杆,我需要在旗杆上方放置另一个图像(“旗帜”)。

如果设备的屏幕尺寸正好是 1280x800,那么“flag”的位置就是 (850, 520)。但屏幕大小可能会有所不同,Android 会根据centerCrop标志相应地缩放和移动背景图像。因此,我需要以某种方式分配比例并转移到“标志”图像,以使其很好地放置在旗杆上方。

我检查了 ImageView.java 并发现 scaleType 用于设置private Matrix mDrawMatrix. 但是我没有对该字段的读取权限,因为它是私有的。

所以,给定

@Override
public void onGlobalLayout()
{
    ImageView bg = ...;
    ImageView flag = ...;
    int bgImageWidth = 1280;
    int bgImageHeight = 800;
    int flagPosX = 850;
    int flagPosY = 520;
    // What should I do here to place flag nicely?
}
4

2 回答 2

0

您可以查看屏幕的大小 ( context.getResources().getDisplayMetrics().widthPixels, context.getResources().getDisplayMetrics().heightPixels;) 并计算从图像中可见的内容,例如您可以执行以下操作(尚未真正测试过,但您应该明白):

private void placeFlag(Context context) {
    ImageView bg = new ImageView(context);
    ImageView flag = new ImageView(context);
    int bgImageWidth = 1280;
    int bgImageHeight = 800;
    int flagPosX = 850;
    int flagPosY = 520;

    int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
    int screenHeight = context.getResources().getDisplayMetrics().heightPixels;

    //calculate the proportions between the width of the bg and the screen
    double widthScale = (double) bgImageWidth / (double) screenWidth;
    double heightScale = (double) bgImageHeight / (double) screenHeight;

    //see the real scale used, it will be the maximum between the 2 values because you are using crop
    double realScale = Math.max(widthScale, heightScale);
    //calculate the position for the flag
    int flagRealX = (int) (flagPosX * realScale);
    int flagRealY = (int) (flagPosY * realScale);
}

此外,您应该在方法中执行此操作,如果您想要自定义视图onGlobalLayout,您可以在构造函数中或内部执行此操作。onCreate()

于 2013-05-21T11:55:54.873 回答
0

您可以在此处使用 LayerDrawable 方法在其静态中制作一个可绘制图像(在其中您可以在 custom_drawable.xml 中的背景图像顶部设置背景图像和图标,并且可以将该文件用作活动中的单个可绘制对象)。参考转到安卓开发者。否则对于根据不同 设备分辨率的缩放问题将图像放在不同的drawable文件夹中,也可以设计不同的布局。

于 2013-05-21T12:13:16.603 回答