热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

动态壁纸LiveWallPaper:让您的桌面栩栩如生(第二篇)

在本文中,我们将继续探讨如何开发动态壁纸LiveWallPaper,使您的桌面更加生动有趣。作为2010年Google暑期大学生博客分享大赛Android篇的一部分,我们将详细介绍EdBurnette的《Hello,Android》第三版中的相关内容,并分享一些实用的开发技巧和经验。通过本篇文章,您将了解到如何利用AndroidSDK创建引人入胜的动态壁纸,提升用户体验。

CS——LiveWallPaper  动态壁纸程序开发(二)

                首届 Google 暑期大学生博客分享大赛——2010 Android 篇

                           《Ed Burnette's  Hello,Android  Third Edition》 重点篇章读书学习改编笔记

  

   书接前文,我们先要介绍Android的services。Android的一个与众不同的特征就是具有可在背景中运行程序的能力。为了将他们与前景的activities分开,Android把这些程序叫做services。

 

   Service类由一个service的main java类继承.Services像 activities一样 也有个生命周期,但较之要简单得多。 在这个周期中,当我们第一次创建service类时, 需要调用onCreate()的方法。而当我们消除该service时,则调用了onDestroy()方法。

 

   而在这两者之间,当客户发出开始service的请求时,Android将调用 onStartCommand()方法 。当然Android也为我们提供一些其他的方法以备不时需,例如在内存低情况下使用的onLowMemory()方法,以及下表一所示。 

                                                                                        表一

公开的部分的方法
void           onRebind(Intent intent)
如果之前通过onUnbind(Intent)方法已经通告解除所有联系后,
当新的clients再与service取得联系时,该方法被调用。
BooleanonUnbind(Intent intent)
当所用Clients都已与一个service发出的特点界面断开联系时,调用该方法。
final void stopSelf()
如果之前它开始过,则自己停止该service。
final void           startForeground(int id, Notification notification)
该方法使该service能够运行在前台(前景上),
并在这个状态下支持将ongoing的通知显示给用户。
final voidstopForeground(boolean removeNotification)
从前景中去除该service,并允许在内存低时杀死service。
想了解更多方法请参考: http://d.android.com/reference/android/app/Service.html


  
当然在我们这个例子中,不需要关心这些方法,因为他们都将由Service的子类WallpaperService 来处理。

   我们的main类需要扩展成Wallpaper,就像下面这样。

1 package classroom。studio;
2  import android.service.wallpaper.WallpaperService;
3  public class Wallpaper extends WallpaperService {
4  private class MyEngine extends Engine {
5  // 从这里实现引擎。。。
6  }
7 @Override
8  public Engine onCreateEngine() {
9  return new MyEngine();
10 }
11 }
12  

 

   我们现在要做的就是实现只有一行代码的onCreateEngine()方法。它的唯一目的就是要创建并返回另一个叫做MyEngine的类。

 

            构建一个绘图引擎

     因为这个MyEngine一定要是Wallpaper里的一个类,所以在类的封闭的大括号中声明了它。MyEngine 扩展了由Android提供的Engine类。以下的代码是带有所有要用到的方法的MyEngine 纲要。

 

ContractedBlock.gifExpandedBlockStart.gifwallpaper.java

1 private class MyEngine extends Engine {
2 @Override
3  public void onCreate(final SurfaceHolder holder) {
4  super.onCreate(holder);
5 }
6 @Override
7  public void onDestroy() {
8  super.onDestroy();
9 };
10 @Override
11  public void onSurfaceCreated(final SurfaceHolder holder) {
12  super.onSurfaceCreated(holder);
13 }
14 @Override
15  public void onSurfaceDestroyed(final SurfaceHolder holder) {
16  super.onSurfaceDestroyed(holder);
17 }@Override
18  public void onSurfaceChanged(final SurfaceHolder holder,
19 final int format, final int width, final int height) {
20 super.onSurfaceChanged(holder, format, width, height);
21 }
22 @Override
23 public void onVisibilityChanged(final boolean visible) {
24 super.onVisibilityChanged(visible);
25 }
26 @Override
27 public void onOffsetsChanged(final float xOffset,
28 final float yOffset, final float xOffsetStep,
29 final float yOffsetStep, final int xPixelOffset,
30 final int yPixelOffset) {
31 super.onOffsetsChanged(xOffset, yOffset, xOffsetStep,
32 yOffsetStep, xPixelOffset, yPixelOffset);
33 }
34 }

 

   需要注意的是每个方法应该总是调用其基类方法。

   在Engine的整个生命周期中,Android会在特定的命令下调用这些方法。下面就是整个句子。

onCreate
     onSurfaceCreated
                  onSurfaceChanged (1+ calls in any order)
                  onOffsetsChanged (0+ calls in any order)
                  onVisibilityChanged (0+ calls in any order)
     onSurfaceDestroyed
onDestroy

  接下来,我们将填写这些方法。不过我们还需要几个声明来防止编译出错,当我们编写代码时我们可以让Eclipse帮我们来创建这些语句(使用 Content Assist(Ctrl+空格)或是 Quick Fix(Ctrl+1) 亦或是通过Source > Organize Imports command ( Ctrl+Shift+O )实现批处理。但如果您愿意的话,也可以自己敲,下面是完整的列表。

 

1 import java.util.concurrent.ExecutorService;
2 import java.util.concurrent.Executors;
3 import javax.microedition.khronos.egl.EGL10;
4 import javax.microedition.khronos.egl.EGL11;
5 import javax.microedition.khronos.egl.EGLConfig;
6 import javax.microedition.khronos.egl.EGLContext;
7 import javax.microedition.khronos.egl.EGLDisplay;
8 import javax.microedition.khronos.egl.EGLSurface;
9 import javax.microedition.khronos.opengles.GL10;
10 import android.service.wallpaper.WallpaperService;
11 import android.view.SurfaceHolder;

 

  下面让我们开始画我们的立方体吧。初始效果如图四所示。OpenGL ES

 

2010081311493269.jpg

 

                                                图四

           To Be Continue.....

 

 

转:https://www.cnblogs.com/ClassroomStudio/archive/2010/08/13/livewallpaper_2.html



推荐阅读
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 在Ubuntu系统中配置Python环境变量是确保项目顺利运行的关键步骤。本文介绍了如何将Windows上的Django项目迁移到Ubuntu,并解决因虚拟环境导致的模块缺失问题。通过详细的操作指南,帮助读者正确配置虚拟环境,确保所有第三方库都能被正确识别和使用。此外,还提供了一些实用的技巧,如如何检查环境变量配置是否正确,以及如何在多个虚拟环境之间切换。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • 本文介绍了一种利用Dom4j库和JFileChooser组件在Java中实现XML文件自定义路径导出的方法。通过创建一个Document对象并设置根元素,结合JFileChooser选择目标路径,实现了灵活的XML文件导出功能。具体步骤包括初始化Document对象、构建XML结构以及使用JFileChooser选择保存路径,确保用户能够方便地将生成的XML文件保存到指定位置。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 在尝试为 Unity 编译一个简单的 Java 库时,运行 `ant jar` 命令后遇到了 Java I/O 异常。具体错误信息为“无法启动程序 ${aAPT},错误代码 2”,这通常表示指定的文件或目录不存在。此问题可能是由于环境配置不正确或路径设置有误导致的。建议检查相关路径和环境变量,确保所有依赖项都已正确安装和配置。 ... [详细]
  • CAS 机制下的无锁队列设计与实现 ... [详细]
  • 利用Python与Android进行高效移动应用开发
    通过结合Python和Android,可以实现高效的移动应用开发。首先,需要安装Scripting Layer for Android (SL4A),这是一个开源项目,旨在为Android系统提供脚本语言支持。SL4A不仅简化了开发流程,还允许开发者使用Python等高级语言编写脚本,从而提高开发效率和代码可维护性。此外,SL4A还支持多种其他脚本语言,进一步扩展了其应用范围。通过这种方式,开发者可以快速构建功能丰富的移动应用,同时保持较高的灵活性和可扩展性。 ... [详细]
  • 在处理大图片时,PHP 常常会遇到内存溢出的问题。为了避免这种情况,建议避免使用 `setImageBitmap`、`setImageResource` 或 `BitmapFactory.decodeResource` 等方法直接加载大图。这些函数在处理大图片时会消耗大量内存,导致应用崩溃。推荐采用分块处理、图像压缩和缓存机制等策略,以优化内存使用并提高处理效率。此外,可以考虑使用第三方库如 ImageMagick 或 GD 库来处理大图片,这些库提供了更高效的内存管理和图像处理功能。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • PHP开发人员薪资水平分析:工程师平均工资概况
    PHP开发人员薪资水平分析:工程师平均工资概况 ... [详细]
  • 基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析
    基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析 ... [详细]
  • Java 枚举类型中如何正确设置和使用枚举值? ... [详细]
author-avatar
mobiledu2502856411
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有