Android Launcher开发(三)动态壁纸(LiveWallPaper)气泡流动效果

最近在研究Laucher应用,今天写了一下四组件中的壁纸(WallPaper),关于静态壁纸的实现,比较简单,在此就不再描述. 参考了系统源代码之后,我自己做了一个简单的动态壁纸:气泡流动效果. 图案比较简单,但基本原理可在此例子上加以扩展,比如3D动画效果,复杂的触摸改变动画事件,有兴趣的朋友可以试一试.


大概效果如下,最开始得时候,会从四个角落的方向浮出四个气泡,然后以一定的路线移动,当移出屏幕时重新开始以新的坐标浮出,以此实现了一个简单的气泡浮动的效果:









实现的思路 :

1、新建一个Android工程 ,注意,对于Live Wallpaper来说传统的布局文件是不需要的。

2、在res下面新建一个xml文件夹 然后新建一个livewallpaper.xml 内容如下:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" android:thumbnail="@drawable/icon"/>  

注意: 这里的android:thumbnail值得是你这个动态壁纸的小图标 会在你选着动态壁纸的时候出现,也可以不写此属性


3. 实现动态壁纸是不需要使用Activity, 创建LiveWallpaper类,让其继承WallpaperService:

实现 onCreateEngine()方法,返回自己实现的Engine类

 在Engine类中的onCreate()方法中进行调用绘制图形的drawFrame()方法

 定义四个圆形的起始坐标,每次调用drawFrame()时改变圆形的坐标,通过mHandler.postDelayed(drawTarget, 100);方法,进行重新绘制图形,更新UI


具体代码如下:


1.AndroidManifest.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="org.crazyit.desktop"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <application  
  7.         android:icon="@drawable/icon"  
  8.         android:label="@string/app_name">  
  9.         <!-- 配置实时壁纸Service -->  
  10.         <service android:label="@string/app_name"  
  11.             android:name=".LiveWallpaper"  
  12.             android:permission="android.permission.BIND_WALLPAPER">  
  13.             <!-- 为实时壁纸配置intent-filter -->  
  14.             <intent-filter>  
  15.                 <action  android:name="android.service.wallpaper.WallpaperService" />  
  16.             </intent-filter>  
  17.             <!-- 为实时壁纸配置meta-data -->  
  18.             <meta-data android:name="android.service.wallpaper"  
  19.                 android:resource="@xml/livewallpaper" />  
  20.         </service>  
  21.     </application>  
  22. </manifest>   

2. 壁纸的xml文件: livewallpaper.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" android:thumbnail="@drawable/icon"/>  

3. 实现动态壁纸的LiveWallpaper类:

  1. import android.graphics.Canvas;  
  2. import android.graphics.Paint;  
  3. import android.os.Handler;  
  4. import android.service.wallpaper.WallpaperService;  
  5. import android.view.MotionEvent;  
  6. import android.view.SurfaceHolder;  
  7. /** 
  8.  *  
  9.  * @author Tian 
  10.  * 
  11.  */  
  12. public class LiveWallpaper extends WallpaperService  
  13. {  
  14.     // 实现WallpaperService必须实现的抽象方法  
  15.     public Engine onCreateEngine()  
  16.     {  
  17.         // 返回自定义的Engine  
  18.         return new MyEngine();  
  19.     }  
  20.   
  21.     class MyEngine extends Engine  
  22.     {  
  23.         // 记录程序界面是否可见  
  24.         private boolean mVisible;  
  25.         // 记录当前当前用户动作事件的发生位置  
  26.         private float mTouchX = -1;  
  27.         private float mTouchY = -1;  
  28.         // 记录当前圆圈的绘制位置  
  29.           
  30.         //左上角坐标  
  31.         private float cx1 = 15;  
  32.         private float cy1 = 20;  
  33.           
  34.         //右下角坐标  
  35.         private float cx2 = 300;  
  36.         private float cy2 = 380;  
  37.           
  38.         //右上角坐标  
  39.         private float cx3 = 300;  
  40.         private float cy3 = 20;  
  41.           
  42.         //左下角坐标  
  43.         private float cx4 = 15;  
  44.         private float cy4 = 380;  
  45.           
  46.         // 定义画笔  
  47.         private Paint mPaint = new Paint();  
  48.         // 定义一个Handler  
  49.         Handler mHandler = new Handler();  
  50.         // 定义一个周期性执行的任务  
  51.         private final Runnable drawTarget = new Runnable()  
  52.         {  
  53.             public void run()  
  54.             {  
  55.                 // 动态地绘制图形  
  56.                 drawFrame();  
  57.             }  
  58.         };  
  59.   
  60.         @Override  
  61.         public void onCreate(SurfaceHolder surfaceHolder)  
  62.         {  
  63.             super.onCreate(surfaceHolder);  
  64.             // 初始化画笔  
  65.             mPaint.setColor(0xffffffff);  
  66.             mPaint.setAntiAlias(true);  
  67.             mPaint.setStrokeWidth(2);  
  68.             mPaint.setStrokeCap(Paint.Cap.ROUND);  
  69.             mPaint.setStyle(Paint.Style.STROKE);  
  70.             // 设置处理触摸事件  
  71.             setTouchEventsEnabled(true);  
  72.         }  
  73.   
  74.         @Override  
  75.         public void onDestroy()  
  76.         {  
  77.             super.onDestroy();  
  78.             // 删除回调  
  79.             mHandler.removeCallbacks(drawTarget);  
  80.         }  
  81.   
  82.         @Override  
  83.         public void onVisibilityChanged(boolean visible)  
  84.         {  
  85.             mVisible = visible;  
  86.             // 当界面可见时候,执行drawFrame()方法。  
  87.             if (visible)  
  88.             {  
  89.                 // 动态地绘制图形  
  90.                 drawFrame();  
  91.             }  
  92.             else  
  93.             {  
  94.                 // 如果界面不可见,删除回调  
  95.                 mHandler.removeCallbacks(drawTarget);  
  96.             }  
  97.         }  
  98.   
  99.         public void onOffsetsChanged(float xOffset, float yOffset, float xStep,  
  100.             float yStep, int xPixels, int yPixels)  
  101.         {  
  102.             drawFrame();  
  103.         }  
  104.   
  105.   
  106.         public void onTouchEvent(MotionEvent event)  
  107.         {  
  108.             // 如果检测到滑动操作  
  109.             if (event.getAction() == MotionEvent.ACTION_MOVE)  
  110.             {  
  111.                 mTouchX = event.getX();  
  112.                 mTouchY = event.getY();  
  113.             }  
  114.             else  
  115.             {  
  116.                 mTouchX = -1;  
  117.                 mTouchY = -1;  
  118.             }  
  119.             super.onTouchEvent(event);  
  120.         }  
  121.   
  122.         // 定义绘制图形的工具方法  
  123.         private void drawFrame()  
  124.         {  
  125.             // 获取该壁纸的SurfaceHolder  
  126.             final SurfaceHolder holder = getSurfaceHolder();  
  127.             Canvas c = null;  
  128.             try  
  129.             {  
  130.                 // 对画布加锁  
  131.                 c = holder.lockCanvas();  
  132.                 if (c != null)  
  133.                 {  
  134.                     c.save();  
  135.                     // 绘制背景色  
  136.                     c.drawColor(0xff000000);  
  137.                     // 在触碰点绘制圆圈  
  138.                     drawTouchPoint(c);  
  139.                       
  140.                     // 绘制圆圈  
  141.                     c.drawCircle(cx1, cy1, 80, mPaint);  
  142.                     c.drawCircle(cx2, cy2, 40, mPaint);  
  143.                     c.drawCircle(cx3, cy3, 50, mPaint);  
  144.                     c.drawCircle(cx4, cy4, 60, mPaint);  
  145.                     c.restore();  
  146.                 }  
  147.             }  
  148.             finally  
  149.             {  
  150.                 if (c != null)  
  151.                     holder.unlockCanvasAndPost(c);  
  152.             }  
  153.             mHandler.removeCallbacks(drawTarget);  
  154.             // 调度下一次重绘  
  155.             if (mVisible)  
  156.             {  
  157.                 cx1 += 6;  
  158.                 cy1 += 8;  
  159.                 // 如果cx1、cy1移出屏幕后从左上角重新开始  
  160.                 if (cx1 > 320)  
  161.                     cx1 = 15;  
  162.                 if (cy1 > 400)  
  163.                     cy1 = 20;  
  164.                   
  165.                   
  166.                 cx2 -= 6;  
  167.                 cy2 -= 8;  
  168.                 // 如果cx2、cy2移出屏幕后从右下角重新开始  
  169.                 if (cx2 <15)  
  170.                     cx2 = 300;  
  171.                 if (cy2 <20)  
  172.                     cy2 = 380;  
  173.                   
  174.                   
  175.                 cx3 -= 6;  
  176.                 cy3 += 8;  
  177.                 // 如果cx3、cy3移出屏幕后从右上角重新开始  
  178.                 if (cx3 <0)  
  179.                     cx3 = 300;  
  180.                 if (cy3 >400)  
  181.                     cy3 = 20;  
  182.                   
  183.                   
  184.                 cx4 += 6;  
  185.                 cy4 -= 8;  
  186.                 // 如果cx4、cy4移出屏幕后从左下角重新开始  
  187.                 if (cx4 >320)  
  188.                     cx4 = 15;  
  189.                 if (cy4 <0)  
  190.                     cy4 = 380;  
  191.                   
  192.                 // 指定0.1秒后重新执行mDrawCube一次  
  193.                 mHandler.postDelayed(drawTarget, 100);  
  194.             }  
  195.         }  
  196.   
  197.         // 在屏幕触碰点绘制圆圈  
  198.         private void drawTouchPoint(Canvas c)  
  199.         {  
  200.             if (mTouchX >= 0 && mTouchY >= 0)  
  201.             {  
  202.                 c.drawCircle(mTouchX, mTouchY, 40, mPaint);  
  203.             }  
  204.         }  
  205.     }  
  206. }  


这样,就基本实现了一个动态壁纸:气泡浮动的效果.


不过这只是一个入门的小例子,如果想达到商用效果,还有很多方面需要进行优化:

1. 绘制更加复杂的图形

2. 使用3D Animation动画效果

3. 色彩方面需要丰富起来

4. 更新UI的方法我使用了handler的postDelay(runnable,millsecond)的方法,这里虽然实现的代码较少,但效率较低,画面仍不够流畅.


不过本人精力有限,因此在此提供了代码,希望有兴趣的朋友可以将其完善,或者给出具体的解决方案,共同讨论





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Launcher开发是指开发一个Android设备的主屏幕应用程序。它是Android系统的一个重要组成部分,负责管理用户的桌面、应用程序、小部件等。开发者可以通过自定义Launcher来提供更好的用户体验和功能,例如添加新的主题、增加快捷方式、调整布局等。开发Android Launcher需要掌握Java编程语言、Android SDK、UI设计等技术。 ### 回答2: Android Launcher是指Android设备上的应用程序界面,它提供了设备上的所有应用程序的图标、文件夹、小部件以及其他应用程序的访问方式。作为一名Android开发人员,开发一个Android Launcher可以让用户获得更好的用户体验,因为它可以改善设备上所有应用程序的访问。 在开发Android Launcher应用时,首先需要了解的是Android系统和API。 开发人员需要熟悉Android的基本UI控件,如布局、文本框、按钮、进度条等,同时也需要了解Android中的Activity、Intent、Service和BroadcastReceiver等概念,这些都是Android应用程序设计和开发的基本元素。 其次,开发Android Launcher需要考虑的是用户体验。在设计应用程序界面时,需要考虑用户的习惯并尽可能地让用户感到方便易用。比如,应用程序的图标排列应该是直观的,常用的应用程序应该是易于访问的,用户也可以根据自己的喜好自定义列表。 而在用户体验方面,除了界面设计充分外,快速响应用户操作也很重要。因此,在开发Launcher应用程序时需要处理程序的效率,尽可能减少不必要的计算和I/O操作,优化应用程序的流程,以保证程序可以快速响应并提高用户体验。 此外,开发人员还要考虑未来的版本或者常规的 bugfixing。可以将 Launcher 分解成多个模块,每个模块都提供服务和功能,同时可以定期添加新的功能或修复已有的 bug。 总体而言,开发Android Launcher需要更多地考虑用户体验和使用情况。如果开发人员能够在这两方面进行适当的优化和改进,他们的Android Launcher应用程序将获得更好的用户反馈并受到用户的欢迎。 ### 回答3: 随着Android系统的发展,桌面Launcher已经成为Android设备上最重要的应用之一。 Android的开源特性使得开发者可以自由地开发自己的Launcher,使得用户可以从多个Launcher中选择最适合自己的一个。 Android Launcher开发主要分为两类:自定义Launcher和替代性Launcher。自定义Launcher通常是根据用户的个性化需求来修改默认的Launcher,包括修改主题、添加小部件、更改图标等。而替代性Launcher则是完全替换默认的Launcher,提供不同的用户体验和界面。 Android Launcher开发需要熟悉Android开发的基础知识,包括Java编程语言和Android框架。在开发过程中,开发者需要了解Launcher的基本工作原理,包括处理用户输入、管理应用程序、布局用户界面和实现自定义主题。 Android Launcher的核心功能包括桌面、应用程序列表、小部件、搜索和设置等功能。其中,桌面管理用户的快捷方式、文件夹和小部件;应用程序列表包括所有已安装应用程序和搜索功能;小部件提供实时信息;搜索功能可快速搜索应用程序和联系人;设置包括个性化设置、主题和插件设置等。 在开发Launcher时,需要考虑多种设备尺寸和分辨率的兼容性问题。此外,为确保在不同版本的Android系统上运行稳定,开发者需要进行充分的测试和优化。 总的来说,Android Launcher开发是一项挑战性较高的任务,需要不断地学习和实践,同时也需要考虑到用户的需求和实际情况。只有通过不断地尝试和创新,才能够打造出一款真正优秀的Launcher

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值