7

我发现用 Android 处理图像真的很困难,我认为这是 Android 开发中最难的部分......

1)我有一张图片,我希望它成为我的应用程序的背景,所以我这样做了

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    tools:context=".MainActivity" 
    android:background="@drawable/accueil">
</RelativeLayout>

背景应该填满整个屏幕,但不是 cas。在某些(小)屏幕上仅显示部分背景。我怎么说:我希望图像填满整个屏幕,即使图像比屏幕大,图像应该缩小以便我看到所有背景?

也许我应该把我的背景而不是用它作为背景

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    tools:context=".MainActivity">


       <ImageView
           android:id="@+id/imageView1"
           android:layout_width="500dp"
           android:layout_height="500dp"
           android:adjustViewBounds="false"
           android:src="@drawable/accueil" />

</RelativeLayout>

然而在某些设备中,图像有点被裁剪。

2)我必须在另一个布局中放置一个布局,但我希望它的位置准确,它的宽度相对于父布局。然而,如果我这样做

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/fond">

 <LinearLayout
     android:layout_width="300dp"
     android:layout_height="350dp"
     android:layout_marginTop="20dp"
     android:background="@drawable/fondshare"
     android:orientation="vertical" >

你可以看到结果不是我所期望的(线性布局是带有笑脸和所有按钮的矩形) 在此处输入图像描述

4

6 回答 6

2

Android 使用两个通用属性对设备屏幕进行分类:尺寸和密度。您应该期望您的应用程序将安装在具有大小和密度范围的屏幕的设备上。因此,您应该包含一些替代资源,以针对不同的屏幕尺寸和密度优化您的应用外观。有四种广义尺寸:small、normal、large、xlarge和四种广义密度:low (ldpi)、medium (mdpi)、high (hdpi)、extra high (xhdpi)

要声明您希望用于不同屏幕的不同布局和位图,您必须将这些替代资源放在单独的目录中,类似于您对不同语言字符串所做的操作。

另请注意,屏幕方向(横向或纵向)被视为屏幕尺寸的变化,因此许多应用程序应修改布局以优化每个方向的用户体验。

有关详细信息,请参阅android.com 的“支持不同屏幕”一文。

于 2013-02-07T09:49:42.760 回答
0

完成这项任务的最佳技术是使用线性布局并使用

 <LinearLayout
 android:layout_width="300dp"
 android:layout_height="350dp"
 android:layout_marginTop="20dp"
 android:weightSum="3"
 android:background="@drawable/fondshare"
 android:orientation="vertical" >

  <View
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    />

  </LinearLayout>

在上述情况下

android:weightSum="要划分布局的部分数"

安卓:layout_weight="1"

您的视图占据的总部分。假设线性布局的 weightsum 为 3 那么视图覆盖的部分将是

视野宽度

(layout_width / WeightSum) * 重量

视野高度

(layout_height / WeightSum) * 重量

在您的情况下,您的视图最终高度为= 119dp

最终宽度为= 100dp

于 2013-02-07T14:20:57.923 回答
0

尝试这个:

我在布局设计中遇到了很多时间。最后我得到了一个解决方案,就像

我已经为大小不同的屏幕创建了布局文件夹。原始布局文件夹 xml 文件仅适用于 HVGA 的普通布局因此为小型布局创建名称=layout-small的文件夹并将 xml 文件放在这里。然后,您为大型布局创建文件夹名称=layout-long的文件夹,并在此处为该布局创建 xml 文件。

于 2013-02-07T10:11:36.763 回答
0

我想如果你想使用 Bitmap 作为你的背景,有一些解决方法:

  1. 为不同的设备设计几种尺寸的图像。(drawable-hdpi,drawable-xhdpi...)
  2. 使用不同的布局并将它们放入使用限定符的不同资源包中。(layout-sw600dp...)
于 2013-02-07T09:29:26.690 回答
0

我建议您调整每个布局文件夹和可绘制文件夹的布局。

布局 layout-800x480 layout-land 等参考这里http://developer.android.com/guide/practices/screens_support.html

或参考此链接。

为不同的屏幕分辨率设计 UI

于 2013-02-07T09:29:49.183 回答
0

我最近不得不做类似的事情。所以这里有一些技巧。

如果要保留图像的纵横比,请在相对布局中使用它。注意:相对布局的布局宽度和高度应为match_parent或fill_parent。

<ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"

        android:id="@+id/bgloginpage"

        android:scaleType="centerCrop" />

这将从中心裁剪图像。还有其他可用的选项。使用fitXY而不是centerCrop来拟合,它适合设备而不考虑纵横比。为了获得最佳效果,请使用相当大的图像。

另一种选择是为您的图像充分添加纯色背景颜色并增加其大小。将其加载到您的 drawables 文件夹并使用此类。

public class ReturnBackGroundImage {



//To avoid java.lang.OutOfMemory exceptions, check the dimensions of a    bitmap before decoding it,
// unless you absolutely trust the source to provide you with predictably sized image data that
// comfortably fits within the available memory.

public static Bitmap decodeSampledBitmapFromResource(Resources resources,    int resId, int reqWidth, int reqHeight, boolean UseDeviceHeight, Activity  activity) {


    if(UseDeviceHeight){
        DisplayMetrics metrics = new DisplayMetrics();

        activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
        reqHeight = metrics.heightPixels;
        reqWidth = metrics.widthPixels;
    }

    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(resources, resId, options);
    return ResizeImage(resources,options,resId,reqWidth,reqHeight);
}

public static Bitmap ResizeImage(Resources resources,BitmapFactory.Options options, int resId, int reqWidth, int reqHeight) {

    double imageHeight = options.outHeight;
    double imageWidth = options.outWidth;
    double ratio = reqHeight / imageHeight;
    int newImageWidth = (int) (imageWidth * ratio);
    Bitmap bMap = BitmapFactory.decodeResource(resources, resId);
    return  getResizedBitmap(bMap, reqHeight, newImageWidth);
   }
}

如下使用它

ImageView v = (ImageView)findViewById(R.id.bgloginpagew);
  v.setImageBitmap(ReturnBackGroundImage.decodeSampledBitmapFromResource(getResources(),R.drawable.mainbgforapp,0,0,true,walkThroughActivity.this));

这是来自 android 网站的示例的修改版本。

如果有人需要保存不同尺寸图像的比例,那就是

  1. xxxhdpi/xxhdpi = 4/3
  2. xxxhdpi/xhdpi = 2/1
  3. xxhdpi/hdpi = 2/1
  4. xhdpi/mdpi = 2/1

afaik 这些比率仅对方形图像有效。我想我会把它放在那里给需要它们的人,就像我一样。

于 2017-02-04T10:09:44.497 回答