1、静态壁纸
    1)获取壁纸实例,实际上是一个服务提供
         WallpaperManager wallpaperManager=WallpaperManager.getInstance(this);
         WallpaperManager.getInstance()方法内容如下:
            public static WallpaperManager getInstance(Context context) {
            return (WallpaperManager)context.getSystemService(
                    Context.WALLPAPER_SERVICE);
         }
    2、使用下列三个方法之一设置壁纸内容
        wallpaperManager.setBitmap(bitmap)
        wallpaperManager.setStream(data);
        wallpaperManager.setResource(R.drawable.a);

2、动态壁纸
   1)、在res目录下建xml目录,并建一个xml文件,如aa.xml
       <?xml version="1.0" encoding="utf-8"?>
       <wallpaper
           xmlns:android="http://schemas.android.com/apk/res/android"
           android:thumbnail="@drawable/c"/>
   2)、写一个类继承WallpaperService类。并重写 public Engine onCreateEngine()方法。
              该方法的返回值Engine即为绘制壁纸的方法。重写该类中的方法,并不强制。
              
                当壁纸的显示、状态或大小变化是,会调用Engine的onCreate,
        onDestroy,onVisibilityChanged, onSurfaceChanged,
        onSurfaceCreated 和onSurfaceDestroyed方法。
        有了这些方法,动态壁纸才能展现出动画效果。
        而通过设置setTouchEventsEnabled(true),
        并且调用onTouchEvent(MotionEvent event)方法,
        来激活触摸事件。
   3)、在清单文件里面注册该服务
          <!-- 配置实时壁纸Service -->  
        <service android:label="@string/app_name"  
            android:name="service类全名"  
            android:permission="android.permission.BIND_WALLPAPER">  
            <!-- 为实时壁纸配置intent-filter -->  
            <intent-filter>  
                <action  android:name="android.service.wallpaper.WallpaperService" />  
            </intent-filter>  
            <!-- 为实时壁纸配置meta-data -->  
            <meta-data android:name="android.service.wallpaper"  
                android:resource="@xml/xml文件夹下的xml文件" />  
         </service>
    4)、使用方法
                   长按屏幕选择动态壁纸进行选择。
                   
    5)、实例
            public class LiveGralley extends WallpaperService{
                // 实现WallpaperService必须实现的抽象方法  
                public Engine onCreateEngine()  
                {  
                    // 返回自定义的Engine  
                    return new MyEngine();  
                }  
              
                class MyEngine extends Engine  
                {  
                    // 记录程序界面是否可见  
                    private boolean mVisible;  
                    // 记录当前当前用户动作事件的发生位置  
                    private float mTouchX = -1;  
                    private float mTouchY = -1;  
                    // 记录当前圆圈的绘制位置  
                      
                    //左上角坐标  
                    private float cx1 = 15;  
                    private float cy1 = 20;  
                      
                    //右下角坐标  
                    private float cx2 = 300;  
                    private float cy2 = 380;  
                      
                    //右上角坐标  
                    private float cx3 = 300;  
                    private float cy3 = 20;  
                      
                    //左下角坐标  
                    private float cx4 = 15;  
                    private float cy4 = 380;  
                      
                    // 定义画笔  
                    private Paint mPaint = new Paint();  
                    // 定义一个Handler  
                    Handler mHandler = new Handler();  
                    // 定义一个周期性执行的任务  
                    private final Runnable drawTarget = new Runnable()  
                    {  
                        public void run()  
                        {  
                            // 动态地绘制图形  
                            drawFrame();  
                        }  
                    };  
              
                    @Override  
                    public void onCreate(SurfaceHolder surfaceHolder)  
                    {  
                        super.onCreate(surfaceHolder);  
                        // 初始化画笔  
                        mPaint.setColor(0xffffffff);  
                        mPaint.setAntiAlias(true);  
                        mPaint.setStrokeWidth(2);  
                        mPaint.setStrokeCap(Paint.Cap.ROUND);  
                        mPaint.setStyle(Paint.Style.STROKE);  
                        // 设置处理触摸事件  
                       //setTouchEventsEnabled(true);  
                    }  
              
                    @Override  
                    public void onDestroy()  
                    {  
                        super.onDestroy();  
                        // 删除回调  
                        mHandler.removeCallbacks(drawTarget);  
                    }  
              
                    @Override  
                    public void onVisibilityChanged(boolean visible)  
                    {  
                        mVisible = visible;  
                        // 当界面可见时候,执行drawFrame()方法。  
                        if (visible)  
                        {  
                            // 动态地绘制图形  
                            drawFrame();  
                        }  
                        else  
                        {  
                            // 如果界面不可见,删除回调  
                            mHandler.removeCallbacks(drawTarget);  
                        }  
                    }  
              
                   /* public void onOffsetsChanged(float xOffset, float yOffset, float xStep,  
                        float yStep, int xPixels, int yPixels)  
                    {  
                        drawFrame();  
                    }*/  
              
              
                    /*public void onTouchEvent(MotionEvent event)  
                    {  
                        // 如果检测到滑动操作  
                        if (event.getAction() == MotionEvent.ACTION_MOVE)  
                        {  
                            mTouchX = event.getX();  
                            mTouchY = event.getY();  
                        }  
                        else  
                        {  
                            mTouchX = -1;  
                            mTouchY = -1;  
                        }  
                        super.onTouchEvent(event);  
                    } */
              
                    private Integer[] mImageIds = {
                            R.drawable.a,   
                            R.drawable.b, R.drawable.c,   
                            R.drawable.d, R.drawable.e,   
                            R.drawable.f, R.drawable.g,   
                            R.drawable.h,
                    };
                    
                    // 定义绘制图形的工具方法  
                    private void drawFrame()  
                    {  
                        // 获取该壁纸的SurfaceHolder  
                        final SurfaceHolder holder = getSurfaceHolder();  
                        Canvas c = null;  
                        try  
                        {  
                            // 对画布加锁  
                            c = holder.lockCanvas();  
                            if (c != null)  
                            {  
                                c.save();  
                                // 绘制背景色  
                                int i = new Random().nextInt(8);
                                
                                Bitmap bitmap = BitmapFactory.decodeResource(getResources(), mImageIds[i]);
                                c.drawBitmap(bitmap, 0, 0, mPaint);
                                // 在触碰点绘制圆圈  
                               // drawTouchPoint(c);  
                                  
                                // 绘制圆圈  
                                c.drawCircle(cx1, cy1, 80, mPaint);  
                                c.drawCircle(cx2, cy2, 40, mPaint);  
                                c.drawCircle(cx3, cy3, 50, mPaint);  
                                c.drawCircle(cx4, cy4, 60, mPaint);  
                                c.restore();  
                            }  
                        }  
                        finally  
                        {  
                            if (c != null)  
                                holder.unlockCanvasAndPost(c);  
                        }  
                        mHandler.removeCallbacks(drawTarget);  
                        // 调度下一次重绘  
                        if (mVisible)  
                        {  
                            cx1 += 6;  
                            cy1 += 8;  
                            // 如果cx1、cy1移出屏幕后从左上角重新开始  
                            if (cx1 > 320)  
                                cx1 = 15;  
                            if (cy1 > 400)  
                                cy1 = 20;  
                            cx2 -= 6;  
                            cy2 -= 8;  
                            // 如果cx2、cy2移出屏幕后从右下角重新开始  
                            if (cx2 <15)  
                                cx2 = 300;  
                            if (cy2 <20)  
                                cy2 = 380;  
                              
                              
                            cx3 -= 6;  
                            cy3 += 8;  
                            // 如果cx3、cy3移出屏幕后从右上角重新开始  
                            if (cx3 <0)  
                                cx3 = 300;  
                            if (cy3 >400)  
                                cy3 = 20;  
                              
                              
                            cx4 += 6;  
                            cy4 -= 8;  
                            // 如果cx4、cy4移出屏幕后从左下角重新开始  
                            if (cx4 >320)  
                                cx4 = 15;  
                            if (cy4 <0)  
                                cy4 = 380;  
                            // 指定0.1秒后重新执行mDrawCube一次  
                            mHandler.postDelayed(drawTarget, 3000);  
                        }  
                    }  
              
                    /*// 在屏幕触碰点绘制圆圈  
                    private void drawTouchPoint(Canvas c)  
                    {  
                        if (mTouchX >= 0 && mTouchY >= 0)  
                        {  
                            c.drawCircle(mTouchX, mTouchY, 40, mPaint);  
                        }  
                    }*/  
                }  
            }

转载于:https://blog.51cto.com/cbg23/1631282

android 动态、静态壁纸实现相关推荐

  1. android动态静态广播,Android BroadcastReceiver实现自定义静态广播和动态广播(黏性广播)...

    思维导图: 静态广播: 当广播发出去的时候 如果接收广播的应用程序已经退出,也能接收广播: 发送者代码: package com.example.g160628_android_21_sender; ...

  2. Android静态壁纸和动态壁纸的使用和理解

    这两天在公众号上偶然看到一篇关于设置动态壁纸的文章,觉得蛮有意思的,学习了一下,以此文章记录一下怎样给手机设置静态壁纸和动态壁纸,设置壁纸的使用方法. 静态壁纸 Android中WallpaperMa ...

  3. Android中对静态壁纸和动态壁纸原理深入理解

    本章主要内容: 讨论动态壁纸的实现. 在动态壁纸的基础上讨论静态壁纸的实现. 讨论WMS对壁纸窗口所做的特殊处理. 本章涉及的源代码文件名及位置: WallpaperManagerService.ja ...

  4. android 动态壁纸

    引用:http://www.ophonesdn.com/article/show/278 http://developer.android.com/resources/samples/CubeLive ...

  5. Android壁纸之静态壁纸

    上篇文章写了有关动态设置壁纸的介绍,也就是WallPagerService的使用 今天来介绍一下超级简单的设置静态设置壁纸的方法 ,代码如下 WallpaperManager wallpaperMan ...

  6. android动态壁纸是什么格式的,为什么动态壁纸为APK格式? -

    动态壁纸需要安装,并且apk格式是Android的一种特殊应用程序格式. 动态壁纸相当于一个应用程序,当然,apk ps: 不要说您被用作计算机桌面和屏幕保护程序. . . 您使用的是akp格式,当然 ...

  7. Android动态桌面,设置壁纸篇

    最近要做一个动态桌面.就看了下动态桌面有关的东西. 1,通过WallpaperManager设置静态壁纸 1.1先通过以下方法获取到WallpaperManager 1.2这个WallpaperMan ...

  8. android 7.1 壁纸路径,android 7.1 默认动态壁纸

    最近客户提了个需求:升级后默认使用动态壁纸. 但是根据网络资料大量修改动态壁纸的都是修改frameworks/base/core/res/res/values/config.xml文件中 defaul ...

  9. Android 动态壁纸(Live Wallpaper)编写注意事项小记

    不要使用Thread 应直接使用Handler与Runnable接口对象组合运行. 使用Thread会产生一些莫名其妙的问题,比如:壁纸预览时报错:壁纸设置时报错:壁纸设置后闪一下即消失变为默认静态壁 ...

最新文章

  1. 9、使用GROUP BY分组查询
  2. eclipse总是运行上一个程序结果
  3. Android 使用ContentProvider(内容提供者)查询手机联系
  4. PyTorch:MNIST数据集手写数字识别
  5. AD制图相关问题总结
  6. Python3——FTP(文件传输协议)
  7. m1芯片Mac安装jekyll+搭建GitHub pages个人博客站点
  8. NUC1157 To the Max【最大子段和+DP】
  9. [渝粤教育] 广东-国家-开放大学 21秋期末考试互联网营销概论10092k2
  10. linux设置定时重启任务
  11. quartz mysql 表_Quartz数据库表分析
  12. Python爬虫技术-根据【理财】关键字爬取“巨潮资讯网”的title
  13. aspcms用mysql_aspcms增加手机版支持与电脑公用一个后台
  14. 流媒体服务器ZLMediaKit
  15. linux下挂载移动硬盘(ntfs格式),Linux下挂载移动硬盘(NTFS格式)
  16. 利用个人PC建设小型服务器
  17. 计算机参数含义,电脑内存条参数各有什么含义?
  18. 大卫艾克~雄狮醒来2:实相的本质(中字)
  19. 信心在生活中起到了什么样的作用
  20. GRUB4DOS(十二)适用于FAT32的分区引导扇区启动代码

热门文章

  1. 20201114-三轴云台storm32 BGC HAKRC调试+
  2. python下对bin文件的处理
  3. 脑控技术原理及受害者自救
  4. 微信小程序实现旋转动画效果
  5. BigDecimal运算和比较大小
  6. markdown笔记(二)—— 插入图片及调整大小
  7. PTA-链表学习-----奇数值结点链表
  8. bootstrapr表格父子框_JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】...
  9. python的re模块替换文件字符串_Python 正则处理_re模块
  10. 微软服务器系统2018,升级微软2018 Windows10 四月正式版17134(1803)系统的多种方法...