【问题标题】:Bitmap drawable resource being clipped位图可绘制资源被剪裁
【发布时间】:2019-03-18 02:11:16
【问题描述】:

我已为应用的加载主题分配了一个可绘制资源。但是,可绘制资源中的位图被剪裁了,我不知道为什么。使用 android:gravity="fill_horizo​​ntal" 会停止水平裁剪,但也会改变图像的纵横比。

如何在不剪裁边缘并保持其原始纵横比的情况下使用图像?

styles.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    </style>

    <!-- Launcher/splash theme. -->
    <style name="AppTheme.Launcher">
        <item name="android:windowBackground">@drawable/launch_screen</item>
        <item name="android:adjustViewBounds">true</item>
    </style>

</resources>

launch_screen.xml

<layer-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:opacity="opaque">

    <!-- Background color-->
    <item android:drawable="@android:color/white"/>

    <!-- Splash Logo -->
    <item>
        <bitmap
            android:src="@drawable/splash_screen"
            android:gravity="center"/>
    </item>
</layer-list>

Original Bitmap

Bitmap using---android:gravity="center"

Bitmap using---android:gravity="fill_horizontal"

临时解决方案: 我找到了一个不完美的解决方案。通过调整项目的高度和宽度,我设法确保图像保持在容器的边界内。图像在不同屏幕尺寸上的缩放比例不同。目前,此设置是我遇到的最佳解决方案。

修改了launch_screen.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Use android:opacity=”opaque” to prevent black flash during theme 
transition. -->

<layer-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:opacity="opaque">

<!-- Background color-->
<item android:drawable="@android:color/white"/>

<!-- Splash Logo -->
<item
    android:height="400dp"
    android:width="400dp"
    android:gravity="center">
    <bitmap
        android:src="@drawable/splash_screen"
        />
</item>

</layer-list>

Amended launch_screen.xml

【问题讨论】:

标签: android bitmap


【解决方案1】:

用这个改变你的launch_screen.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:opacity="opaque">

    <item android:width="220dp" android:height="220dp">
        <bitmap
            android:src="@drawable/splash_screen"
            android:gravity="center"/>
    </item>
</layer-list>

编辑:我更新了代码,试试这个。

【讨论】:

  • 这不起作用。它减少了剪辑,但拉伸了图像以适应屏幕,改变了它的纵横比。
  • 那也没用。它将图像向上和向左移动,将大部分图像移出屏幕。
【解决方案2】:

在您的 AndroidStudioProjects 文件夹中,通常位于 C:\Users\username\AndroidStudioProjects,您会找到 drawable dimension 文件夹

Dimensions

 - LDPI:
    - Portrait: 200x320px
    - Landscape: 320x200px
 - MDPI:
    - Portrait: 320x480px
    - Landscape: 480x320px
 - HDPI:
    - Portrait: 480x800px
    - Landscape: 800x480px
 - XHDPI:
    - Portrait: 720px1280px
    - Landscape: 1280x720px
 - XXHDPI
    - Portrait: 960x1600px
    - Landscape: 1600x960px
 - XXXHDPI 
    - Portrait: 1280x1920px
    - Landscape: 1920x1280px

使用以下尺寸调整原始图像的大小并将它们放在正确的文件夹中。 我还看到您的图像是一个白色背景的徽标,因此您可以在 Photoshop 等图像编辑器中使您的徽标透明。

然后在你的drawable文件夹中创建一个drawable

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:drawable="@color/color1"/> <-- this is the background color in your splashscreen.

    <item>
        <bitmap
            android:gravity="top"
            android:src="@drawable/splashlogo"/> <-- your transparent logo.
    </item>

</layer-list>

然后在你的 values 文件夹中创建 Style -> styles.xml

 <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/splash_screen</item>
 </style>

最后将主题样式添加到清单中

<activity
      android:name=".SplashActivity"
      android:theme="@style/SplashTheme"  <-- your splashscreen theme style.
      android:label="@string/app_name"
      android:screenOrientation="portrait">
          <intent-filter>
             <action android:name="android.intent.action.MAIN" />

             <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
</activity>

PS:确保您为 Splashscreen 创建了一个 Activity,并在 onCreate 中启动了一个打开 MainActivity 的意图。

@Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);

     Intent mainIntent = new Intent(SplashActivity.this, MainActivity.class);
     startActivity(mainIntent);
     finish();      
}

【讨论】:

  • 我找到了一种解决方法,通过设置图像的高度和宽度来避免该问题。指定大小的缺点是它不能随不同的屏幕分辨率缩放。 ---您的回答实际上并没有解决问题。不同的 Drawable 文件夹不适用于特定的分辨率,它们用于特定的屏幕密度(dpi = 每英寸点数)。例如,一张 800x600 的图像可以有 72、150、300 等的 DPI。图像仍然是 800x600,但更高的 DPI 可以在相同的空间中保存更多的数据并提供更高保真度的图像。
  • 图片实际上已经是透明的了。此外,您可以在我的原始帖子中看到我的 drawable.xml 与您的几乎相同,除了重力不同。但是,将重力设置为 top 会将图像移动到屏幕的上边框,而不是将其放置在中心。 --- 我已经在 styles.xml 和清单中列出了主题,请参阅原始帖子。
  • 为 Splashscreen 创建 Activity 是不必要的,并且在应用配置完成后不将用户发送到 MainActivity.java,这违反了设计准则。 MainActivity.java 中的主题切换是实现相同结果的更简单方法。为此,请在调用super.onCreate之前 将以下代码添加到'protected void onCreate'。 setTheme(R.style.AppTheme) AppTheme 是该应用在 styles.xml 中的主主题名称
  • 我遵循了一个指南,该指南确实指出不使用启动屏幕的活动会更好,但是使用启动 mainActivity 意图的活动几乎没有任何缺点。来源:android.jlelse.eu/…
  • 除了转换时的小延迟,对于我的应用来说这不是什么大不了的事,但我想这是个人喜好。
猜你喜欢
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 2019-05-10
相关资源
最近更新 更多