2KB项目,专业的源码交易网站 帮助 收藏 每日签到

创建 Android 动态墙纸

  • 时间:2019-01-23 18:44 编辑:2KB 来源:2KB.COM 阅读:334
  • 扫一扫,手机访问
  • 分享
摘要:
Android 英文原文:How To Create Android Live Wallpaper

介绍

从 Android 2.1. (API Level 7) 开始,开发者就可以为 Android 手机创建动态墙纸——更丰富效果、动画和交互的背景。动态墙纸跟一个普通的 Android 应用差不多,你可以创建菜单设置、使用 SGL 和 OpenGL 绘图、使用加速度计等等。

在这篇文章中,我们将创建一个简单的动态墙纸应用,这个应用像是一个电视机的颜色测试界面,如下图所示。

本文主要涉及以下几个部分内容:

  1. 使用 Canvas 类绘制一些基本图形
  2. 开发适合不同屏幕和分辨率以及方向的应用
  3. 为动态墙纸创建设置对话框
  4. 从 XML 资源文件读取不同的值
  5. 创建动态墙纸应用

背景

你还可以在网上找到一些类似的应用,提供更全面的功能和效果:

使用代码

1. 新建 Android 虚拟设备 —— AVD

打开 Android SDK and AVD manager.

按照如下信息创建 AVD

  1. 目标平台:Android 2.1 or higher
  2. 支持加速度计 (下一步我们还要添加屏幕旋转检测)
  3. 支持触摸屏

选择任何一个分辨率,因为我们的程序将检测屏幕的分辨率并自动适应。

2. 创建项目文件

名为LiveWallpaper.

当创建 Android 项目时,选择 Build Target 为 Android 2.1.

默认情况下,项目将包含如下文件:

我们需要做一些更改,添加一些新文件。

首先删除 layout 目录以及 res 目录下的 main.xml 文件,我们要直接在应用中创建布局。

创建 xml 文件夹,并创建两个新文件:livewallpaper.xml 和 livewallpaper_settings.xml ,这两个文件包含服务的信息和设置对话框布局。

Livewallpaper.xml

<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
    android:settingsActivity="ca.jvsh.livewallpaper.LiveWallpaperSettings"
    android:thumbnail="@drawable/icon"/>

文件中的 wallpaper标签注明我们创建的是一个动态墙纸服务。

Livewallpaper_settings.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    android:title="@string/livewallpaper_settings"
    android:key="livewallpaper_settings">

    <ListPreference
        android:key="livewallpaper_testpattern"
        android:title="@string/livewallpaper_settings_title"
        android:summary="@string/livewallpaper_settings_summary"
        android:entries="@array/livewallpaper_testpattern_names"
        android:entryValues="@array/livewallpaper_testpattern_prefix"/>
    <CheckBoxPreference android:key="livewallpaper_movement"
        android:summary="@string/livewallpaper_movement_summary"
        android:title="@string/livewallpaper_movement_title"
        android:summaryOn="Moving test pattern"
        android:summaryOff="Still test pattern"/>
</PreferenceScreen>

文件中的ListPreference 为我们创建一个列表选项,而CheckBoxPreference 显示这些选项是开关选项(Yes/No)

在 values 目录下的 strings.xml 内容如下:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <!-- General -->
    <skip />
    <!-- Application name -->
    <string name="app_name">Live Wallpaper</string>

    <string name="livewallpaper_settings">Settings</string>
    <string name="livewallpaper_settings_title">Select test pattern</string>
    <string name="livewallpaper_settings_summary">
		Choose which test pattern to display</string>
    <string name="livewallpaper_movement_title">Motion</string>
    <string name="livewallpaper_movement_summary">
		Apply movement to test pattern</string>
</resources>

你可以根据你使用的语言来修改这个文件。

同样在这个项目里,你还可以找到 testpattern.xml 文件,它包含电视测试模式的名称和颜色信息。

3. 看看代码

你可在我提供的代码中查看整个项目,下面提供的是一些重要的部分。

如何检测屏幕大小和方向?

你可以使用DisplayMetrics类

DisplayMetrics metrics = new DisplayMetrics();
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
display.getMetrics(metrics);

mRectFrame = new Rect(0, 0, metrics.widthPixels, metrics.heightPixels);


int rotation = display.getOrientation();
if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180)
    mHorizontal = false;
else
    mHorizontal = true;

使用GradientDrawable类绘制梯度效果:

private Rect                mGradientRect;
GradientDrawable            mGradient;

mGradientRect = new Rect(10,10, 40, 40);
mGradient = new GradientDrawable(Orientation.LEFT_RIGHT, new int[] 
		{ 0xff050505, 0xfffdfdfd });
mGradient.setBounds(mGradientRect);
mGradient.draw(c);

下面代码从 testpatterns.xml 中读取颜色值并让我们修改设置:

public void onSharedPreferenceChanged(SharedPreferences prefs,
        String key)
{
    mShape = prefs.getString("livewallpaper_testpattern", "smpte");
    mMotion = prefs.getBoolean("livewallpaper_movement", true);
    readColors();
}

private void readColors()
{
    int pid = getResources().getIdentifier(mShape + "colors", "array", getPackageName());

    rectColor = getResources().getIntArray(pid);
    mRectCount = rectColor.length;
    mColorRectangles = new Rect[mRectCount];

    System.out.println("mRectCount "+mRectCount);
    initFrameParams();
}

4. 编辑 AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ca.jvsh.livewallpaper"
    android:versionName="1.0.20100908.1"
    android:versionCode="1">

    <uses-sdk android:minSdkVersion="7" />
    <uses-feature android:name="android.software.live_wallpaper" />

    <application android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:permission="android.permission.BIND_WALLPAPER">

        <service android:name=".LiveWallpaper"
            android:label="@string/app_name"
            android:icon="@drawable/icon">

            <intent-filter>
                <action android:name="android.service.wallpaper.WallpaperService" />
            </intent-filter>
            <meta-data android:name="android.service.wallpaper"
                android:resource="@xml/livewallpaper" />

        </service>

        <activity android:label="@string/livewallpaper_settings"
            android:name=".LiveWallpaperSettings"
            android:theme="@android:style/Theme.Light.WallpaperSettings"
            android:exported="true"
            android:icon="@drawable/icon">
        </activity>

    </application>
</manifest>

上面内容非常重要的是设置android:permission="android.permission.BIND_WALLPAPER",这个设置项允许墙纸停留在手机首屏。

5. 运行结果

 

提示

Android 动态墙纸只在 Android 2.1 以及以后版本提供,你还需要如下的设置项来告诉 Android Market 你这是一个动态墙纸应用:

<uses-feature android:name="android.software.live_wallpaper" />

下载本文源码:http://www.oschina.net/code/snippet_12_9430

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。


2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务

  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【计算机/互联网|】Nginx出现502错误(2020-01-20 21:02)
【计算机/互联网|】网站运营全智能软手V0.1版发布(2020-01-20 12:16)
【计算机/互联网|】淘宝这是怎么了?(2020-01-19 19:15)
【行业动态|】谷歌关闭小米智能摄像头,因为窃听器显示了陌生人家中的照片(2020-01-15 09:42)
【行业动态|】据报道谷歌新闻终止了数字杂志,退还主动订阅(2020-01-15 09:39)
【行业动态|】康佳将OLED电视带到美国与LG和索尼竞争(2020-01-15 09:38)
【行业动态|】2020年最佳AV接收机(2020-01-15 09:35)
【行业动态|】2020年最佳流媒体设备:Roku,Apple TV,Firebar,Chromecast等(2020-01-15 09:31)
【行业动态|】CES 2020预览:更多的流媒体服务和订阅即将到来(2020-01-08 21:41)
【行业动态|】从埃隆·马斯克到杰夫·贝佐斯,这30位人物定义了2010年代(2020-01-01 15:14)
联系我们

Q Q: 7090832

电话:400-0011-990

邮箱:7090832@qq.com

时间:9:00-23:00

联系客服
商家入住 服务咨询 投拆建议 联系客服
0577-67068160
手机版

扫一扫进手机版
返回顶部