位图可绘制资源被裁剪

时间:2019-03-10 03:19:06

标签: android bitmap

我已经为应用程序的加载主题分配了可绘制资源。但是,可绘制资源中的位图已被裁剪,我不知道为什么。使用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

2 个答案:

答案 0 :(得分:0)

以此更改您的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>

编辑:我更新了代码,请尝试一下。

答案 1 :(得分:0)

通常位于 C:\ Users \ username \ AndroidStudioProjects 的AndroidStudioProjects文件夹中,您会找到可绘制尺寸的文件夹

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之类的图像编辑器中使徽标透明即可。

然后在您的可绘制文件夹中创建一个可绘制对象

<?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>

然后在您的值文件夹中创建样式-> 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:确保已为启动屏幕创建了一个活动,并在onCreate中启动了打开MainActivity的意图。

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

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