温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

android 动态、静态壁纸实现

发布时间:2020-06-08 05:23:14 来源:网络 阅读:1275 作者:向往宇宙 栏目:移动开发

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);  
                        }  
                    }*/  
                }  
            }

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI