精华内容
下载资源
问答
  • 看到有些手机酷炫的动态壁纸,有没有好奇过他们是如何实现的,其实我们自己也可以实现。 一、动态壁纸原理 如果你了解使用过SurfaceView的话,那么开发一款动态壁纸对你来说其实非常简单。 动态壁纸的本质其实就是...
  • Android自定义动态壁纸开发

    万次阅读 多人点赞 2019-01-06 18:35:47
    看到有些手机酷炫的动态壁纸,有没有好奇过他们是如何实现的,其实我们自己也可以实现。 一、动态壁纸原理 如果你了解使用过SurfaceView的话,那么开发一款动态壁纸对你来说其实非常简单。 动态壁纸的本质其实...

    看到有些手机酷炫的动态壁纸,有没有好奇过他们是如何实现的,其实我们自己也可以实现。

    一、动态壁纸原理

    如果你了解使用过SurfaceView的话,那么开发一款动态壁纸对你来说其实非常简单。

    动态壁纸的本质其实就是一个服务在维护一个动态壁纸引擎Engine,所以我们看到的动态效果其实是通过这个引擎画出来的。而维护这个引擎的服务,就是WallpaperService。本篇文章并不讨论内部实现原理,只是让大家知道如何去实现动态壁纸,所以就不详细说了。

     

    二、实现动态壁纸

    大体上可分为三个步骤:

    1. 创建自定义WallpaperService继承WallpaperService
    2. 在Manifest中注册该Service并添加相关属性
    3. 创建所需要的xml文件

    1.创建自定义WallpaperService

    public class MyLwp extends WallpaperService {
        @Override
        public Engine onCreateEngine() {
            return new MyEngine();
        }
    
        class MyEngine extends  Engine{
            @Override
            public SurfaceHolder getSurfaceHolder() {
                return super.getSurfaceHolder();
            }
    
            @Override
            public void onCreate(SurfaceHolder surfaceHolder) {
                super.onCreate(surfaceHolder);
            }
    
            @Override
            public void onDestroy() {
                super.onDestroy();
            }
    
            @Override
            public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                super.onSurfaceChanged(holder, format, width, height);
            }
    
            @Override
            public void onSurfaceCreated(SurfaceHolder holder) {
                super.onSurfaceCreated(holder);
            }
    
            @Override
            public void onSurfaceDestroyed(SurfaceHolder holder) {
                super.onSurfaceDestroyed(holder);
            }
        }
    }

    2.Manifest注册

            <service
                android:name=".MyLwp"
                android:enabled="true"
    
                android:permission="android.permission.BIND_WALLPAPER">
                <intent-filter>
                    <action android:name="android.service.wallpaper.WallpaperService" />
                </intent-filter>
                <meta-data
                    android:name="android.service.wallpaper"
                    android:resource="@xml/livewallpapervideo" />
            </service>

    一定要添加的几个地方:permission、intent-filter、meta-data。

    3.创建需要的xml文件

    这个xml文件就是Manifest中meta-data中的resource需要的文件:

    <?xml version="1.0" encoding="utf-8"?>
    <wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
        android:description="@string/app_name"
        android:settingsActivity="ASD"
        android:thumbnail="@mipmap/ic_launcher"/>

    需要注意第二个属性:settingsActivity,这个属性可以设置也可以不设置,他是启动一个设置动态壁纸的界面,一般情况下其实用不到这个界面,我们一般会使用PreferenceActivity去实现。下面是添加该属性和不添加该属性的区别:

    完成这些之后,就是我们设计动态壁纸的时候了。回到自定义的Wallpaper类中:

    我们当时在类中自定义了一个内部类MyEngine继承自Engine。这个Engine就是用来绘制的。关于Engine的几个主要方法如下:

        class MyEngine extends  Engine{
            //获取SurfaceHolder时调用
            @Override
            public SurfaceHolder getSurfaceHolder() {
                return super.getSurfaceHolder();
            }
    
            //手势移动时回调
            @Override
            public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {
                super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset);
            }
    
            //Surface创建时回调
            @Override
            public void onSurfaceCreated(SurfaceHolder holder) {
                super.onSurfaceCreated(holder);
            }
    
            //Surface销毁时回调
            @Override
            public void onSurfaceDestroyed(SurfaceHolder holder) {
                super.onSurfaceDestroyed(holder);
            }
        }

    onOffsetsChanged要注意一下,还记得有的手机滑动桌面时候背景图片会跟着左右移动吗,这个方法就可以实现这个效果,在手势滑动的每一帧都会回调依次。一下是个人理解的参数的含义:

    xOffset:x方向滑动的百分比(与桌面分页数有关)

    yOffset:y方向滑动百分比(一般用不到)

    xOffsetStep:x方向每个分页所占的百分比(1 / xOffsetStep = 桌面的分页数)

    yOffsetStep:同

    xPixelOffset:x放下像素偏移量

    y。。。。。

     

    4.绘制。

    实现绘制的方式,就跟SurfaceView的绘制一样了:

            @Override
            public void onSurfaceCreated(SurfaceHolder holder) {
                super.onSurfaceCreated(holder);
                Canvas canvas = holder.lockCanvas();
                canvas.drawColor(Color.RED);
                holder.unlockCanvasAndPost(canvas);
            }

    我只是简单的话了一个红色背景,效果如下:

    当然可以实现很多不同的效果,这个就根据不同的需求去实现了。

    展开全文
  • 看到有些手机酷炫的动态壁纸,有没有好奇过他们是如何实现的,其实我们自己也可以实现。一、动态壁纸原理如果你了解使用过SurfaceView的话,那么开发一款动态壁纸对你来说其实非常简单。动态壁纸的本质其实就是一个...

    看到有些手机酷炫的动态壁纸,有没有好奇过他们是如何实现的,其实我们自己也可以实现。

    一、动态壁纸原理

    如果你了解使用过SurfaceView的话,那么开发一款动态壁纸对你来说其实非常简单。

    动态壁纸的本质其实就是一个服务在维护一个动态壁纸引擎Engine,所以我们看到的动态效果其实是通过这个引擎画出来的。而维护这个引擎的服务,就是WallpaperService。本篇文章并不讨论内部实现原理,只是让大家知道如何去实现动态壁纸,所以就不详细说了。

    二、实现动态壁纸

    大体上可分为三个步骤:

    创建自定义WallpaperService继承WallpaperService

    在Manifest中注册该Service并添加相关属性

    创建所需要的xml文件

    1.创建自定义WallpaperService

    public class MyLwp extends WallpaperService {

    @Override

    public Engine onCreateEngine() {

    return new MyEngine();

    }

    class MyEngine extends Engine{

    @Override

    public SurfaceHolder getSurfaceHolder() {

    return super.getSurfaceHolder();

    }

    @Override

    public void onCreate(SurfaceHolder surfaceHolder) {

    super.onCreate(surfaceHolder);

    }

    @Override

    public void onDestroy() {

    super.onDestroy();

    }

    @Override

    public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    super.onSurfaceChanged(holder, format, width, height);

    }

    @Override

    public void onSurfaceCreated(SurfaceHolder holder) {

    super.onSurfaceCreated(holder);

    }

    @Override

    public void onSurfaceDestroyed(SurfaceHolder holder) {

    super.onSurfaceDestroyed(holder);

    }

    }

    }

    展开全文
  • 看到有些手机酷炫的动态壁纸,有没有好奇过他们是如何实现的,其实我们自己也可以实现。 先看效果 上图是动态壁纸钟的一个时钟。 我们先来看看 Livewallpaper(即动态墙纸)的实现,Android的动态墙纸并不是GIF...
  • 热门动态壁纸主题锁屏墙纸精选这款软件将会为用户们提供更多高清精美的壁纸,多种风格分类让你肆意挑选,超多热门的动态壁纸可以让用户们自由选择,为你带来更加个性化的手机桌面。还可以将自己喜欢的视频进行上传,...

    热门动态壁纸主题锁屏墙纸精选这款软件将会为用户们提供更多高清精美的壁纸,多种风格分类让你肆意挑选,超多热门的动态壁纸可以让用户们自由选择,为你带来更加个性化的手机桌面。还可以将自己喜欢的视频进行上传,制作出独一无二的动态壁纸。

    e375e3a22b5cd03c98a9462ec62f4f25.png

    《热门动态壁纸主题锁屏墙纸精选》软件特色:

    流行的壁纸,网红壁纸和流行的网络短视频,拥有您想要的一切,您可以将其设置为桌面锁定屏幕。

    2.透明的桌面主题和创意的视频桌面游戏玩法使移动桌面独树一帜。

    3.您还可以上传本地视频,只需单击一下,就可以将自己喜欢的视频制作到动态桌面中,并自定义独家动态壁纸。

    22e420babc2293bc0596ff71f4827cef.png

    《热门动态壁纸主题锁屏墙纸精选》软件亮点:

    1.所有墙纸均为绝对高清大图,可适应各种型号的手机,并有多种类型可供选择。

    2.各种各样的样式,可以在网上找到许多不同类型的主题样式,整体图片看起来很舒服。

    3.可以找到各种带有引人注目的帧的图片,每张图片都有一个小标签,您可以通过该小标签搜索所需的图片。

    dd8742d9f74bb65fa71db4f4e68d413d.png

    《热门动态壁纸主题锁屏墙纸精选》小编点评:

    使用这款壁纸软件,你将会拥有一个全网最全的动态壁纸库,各种不同风格的动态壁纸应有尽有,用户们可以直接根据自己的喜好在这些分类中进行自由搜索浏览,让你拥有最独特的动态壁纸。

    展开全文
  • 今天我这用图片bitmap的方式,大概的方法原理是:(1)首先用clipPath裁剪园区域,(2)然后用4张图来不断绘制到画布上,再用偏移量来控制移动的速度,从而形成波浪动态效果。(3)有一点需要注意的是,裁剪圆的时候用到的...

    像360卫士的波浪球进度的效果,一般最常用的方法就是画线的方式,先绘sin线或贝塞尔曲线,然后从左到右绘制竖线,然后再裁剪圆区域。

    今天我这用图片bitmap的方式,大概的方法原理是:

    (1)首先用clipPath裁剪园区域,

    (2)然后用4张图来不断绘制到画布上,再用偏移量来控制移动的速度,从而形成波浪动态效果。

    (3)有一点需要注意的是,裁剪圆的时候用到的clipPath这个方法,在android 4.1,和4.2等某些系统上,裁剪出来不是圆,而是矩形,针对这些系统 需要在manifest.xml文件的activity中

    将硬件加速关掉,因为默认是开启的。即添加这个:android:hardwareAccelerated="false"

    (源码在下面最后给出哈)

    手机上的效果:

    60c1d14921c6609afcc813e5bcb1168e.gif

    70d95816049cb68e51de50659b3ae5bb.png

    下面咱们就来看看怎么实现吧:

    (1)自定义波浪View的实现:

    package com.czm.mysinkingview;

    import android.content.Context;

    import android.graphics.Bitmap;

    import android.graphics.BitmapFactory;

    import android.graphics.Canvas;

    import android.graphics.Color;

    import android.graphics.Paint;

    import android.graphics.Paint.Style;

    import android.graphics.Path;

    import android.graphics.Path.Direction;

    import android.graphics.Region.Op;

    import android.util.AttributeSet;

    import android.util.Log;

    import android.widget.FrameLayout;

    /**

    * 水波浪球形进度View

    * @author caizhiming

    *

    */

    public class MySinkingView extends FrameLayout {

    private static final int DEFAULT_TEXTCOLOT = 0xFFFFFFFF;

    private static final int DEFAULT_TEXTSIZE = 250;

    private float mPercent;

    private Paint mPaint = new Paint();

    private Bitmap mBitmap;

    private Bitmap mScaledBitmap;

    private float mLeft, mTop;

    private int mSpeed = 15;

    private int mRepeatCount = 0;

    private Status mFlag = Status.NONE;

    private int mTextColor = DEFAULT_TEXTCOLOT;

    private int mTextSize = DEFAULT_TEXTSIZE;

    public MySinkingView(Context context, AttributeSet attrs) {

    super(context, attrs);

    }

    public void setTextColor(int color) {

    mTextColor = color;

    }

    public void setTextSize(int size) {

    mTextSize = size;

    }

    public void setPercent(float percent) {

    mFlag = Status.RUNNING;

    mPercent = percent;

    postInvalidate();

    }

    public void setStatus(Status status) {

    mFlag = status;

    }

    public void clear() {

    mFlag = Status.NONE;

    if (mScaledBitmap != null) {

    mScaledBitmap.recycle();

    mScaledBitmap = null;

    }

    if (mBitmap != null) {

    mBitmap.recycle();

    mBitmap = null;

    }

    }

    @Override

    protected void dispatchDraw(Canvas canvas) {

    super.dispatchDraw(canvas);

    int width = getWidth();

    int height = getHeight();

    //裁剪成圆区域

    Path path = new Path();

    canvas.save();

    path.reset();

    canvas.clipPath(path);

    path.addCircle(width / 2, height / 2, width / 2, Direction.CCW);

    canvas.clipPath(path, Op.REPLACE);

    if (mFlag == Status.RUNNING) {

    if (mScaledBitmap == null) {

    mBitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.wave2);

    mScaledBitmap = Bitmap.createScaledBitmap(mBitmap, mBitmap.getWidth(), getHeight(), false);

    mBitmap.recycle();

    mBitmap = null;

    mRepeatCount = (int) Math.ceil(getWidth() / mScaledBitmap.getWidth() + 0.5) + 1;

    }

    for (int idx = 0; idx < mRepeatCount; idx++) {

    canvas.drawBitmap(mScaledBitmap, mLeft + (idx - 1) * mScaledBitmap.getWidth(), (1-mPercent) * getHeight(), null);

    }

    String str = (int) (mPercent * 100) + "%";

    mPaint.setColor(mTextColor);

    mPaint.setTextSize(mTextSize);

    mPaint.setStyle(Style.FILL);

    canvas.drawText(str, (getWidth() - mPaint.measureText(str)) / 2, getHeight() / 2 + mTextSize / 2, mPaint);

    mLeft += mSpeed;

    if (mLeft >= mScaledBitmap.getWidth())

    mLeft = 0;

    // 绘制外圆环

    mPaint.setStyle(Paint.Style.STROKE);

    mPaint.setStrokeWidth(4);

    mPaint.setAntiAlias(true);

    mPaint.setColor(Color.rgb(33, 211, 39));

    canvas.drawCircle(width / 2, height / 2, width / 2 - 2, mPaint);

    postInvalidateDelayed(20);

    }

    canvas.restore();

    }

    public enum Status {

    RUNNING, NONE

    }

    }

    (2)布局文件的实现:

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:background="#000000"

    tools:context=".MainActivity" >

    android:id="@+id/sinking"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_centerInParent="true" >

    android:id="@+id/image"

    android:layout_width="400dp"

    android:layout_height="400dp"

    android:src="@drawable/charming2" />

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_alignParentBottom="true"

    android:layout_centerHorizontal="true"

    android:orientation="horizontal" >

    android:id="@+id/btn_test"

    android:layout_width="80dp"

    android:layout_height="wrap_content"

    android:text="体验" />

    (3)如何使用自定义波浪View:

    package com.czm.mysinkingview;

    import android.app.Activity;

    import android.os.Bundle;

    import android.view.View;

    import android.view.View.OnClickListener;

    import android.widget.ImageView;

    /**

    * 使用并测试用例页

    *

    * @author caizhiming

    */

    public class MainActivity extends Activity {

    private MySinkingView mSinkingView;

    private float percent = 0;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    mSinkingView = (MySinkingView) findViewById(R.id.sinking);

    findViewById(R.id.btn_test).setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View v) {

    // TODO Auto-generated method stub

    test();

    }

    });

    percent = 0.56f;

    mSinkingView.setPercent(percent);

    }

    private void test() {

    Thread thread = new Thread(new Runnable() {

    @Override

    public void run() {

    percent = 0;

    while (percent <= 1) {

    mSinkingView.setPercent(percent);

    percent += 0.01f;

    try {

    Thread.sleep(40);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    percent = 0.56f;

    mSinkingView.setPercent(percent);

    // mSinkingView.clear();

    }

    });

    thread.start();

    }

    }

    最后,照例,给出源码地址

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

    展开全文
  • 可以自定义壁纸 所以可小清新可性感可俏皮.... 自定义添加删除导航网址 支持云同步 调整导航区透明度等等 手机浏览器也是支持的-_- 快去试试 更多功能自己去发掘吧 放几张图 对了功能菜单在右下角...
  • 手机上设置动态壁纸,要先打开...动态壁纸怎么设置苹果1、首先打开苹果手机的设置应用,然后选择【墙纸】的选项,在这里可以看到三种壁纸类型,分别是【动态墙纸】、【静态墙纸】、【实况】。2、由于是设置动态壁...
  • 提供了海量高清壁纸以及各种各样主题的《视频动态壁纸》APP带给大家,大家可以根据自己喜欢的类型进行更换使用,打造独一无二的手机桌面。无论是动态壁纸还是静态壁纸都能在这里找到,各色各样的壁纸任你挑选,本地...
  • 【Win10应用开发】自定义桌面壁纸 原文:【Win10应用开发】自定义桌面壁纸调用通用的API来设置桌面壁纸,是一件既简单又有趣的事情,结合XAML可以生成图像的特性,你甚至可以做一个应用,让用户用他所...
  • 软件介绍这款动态壁纸的APP应用与安卓壁纸的开发者是同一个,就分开做了个动态壁纸,这样会方便很多喜欢动态壁纸的用户。官方介绍:终有一天,轻触屏幕,优美画卷展现眼前。终有一天,姹紫嫣红,纵情采摘属于我的...
  • 许可授权 在您遵守本EULA条款和条件的前提下,自定义授予您有限的,非排他的,可撤销的,不可再许可的,不可转让的许可证,以在以下位置访问,下载和安装最新版本的应用程序:您为合法,个人和非商业性娱乐用途而...
  • 最初是一个客户找我说要仿某个浏览器主页 一看挺简洁 就仿着写下来了 ... 支持自定义导航 同时支持云同步功能仿丢失 看一下效果 ...支持手机移动版 亲爱的 有木有喜欢上这个极简清爽的主页呢 有...
  • 看到有些手机酷炫的动态壁纸,有没有好奇过他们是如何实现的,其实我们自己也可以实现。 一、动态壁纸原理 如果你了解使用过SurfaceView的话,那么开发一款动态壁纸对你来说其实非常简单。 动态壁纸的本质其实就是一...
  • 这两天在公众号上偶然看到一篇关于设置动态壁纸的文章,觉得蛮有意思的,学习了一下,以此文章记录一下怎样给手机设置静态壁纸动态壁纸,设置壁纸的使用方法。 静态壁纸 设置静态壁纸是通过调用系统...
  • ① 运行流畅,没有卡顿,APK占用手机内存少; ② 使用特殊颜色和形状标注出特定日期(如当前日期、双休日、本月日期、非本月日期),便于区别; ③ 背景图均为精心挑选,每张图的景色都代表特定的月份,经过后期...
  • 讨论动态壁纸的实现。 在动态壁纸的基础上讨论静态壁纸的实现。 讨论WMS对壁纸窗口所做的特殊处理。 本章涉及的源代码文件名及位置: WallpaperManagerService.java frameworks/base/services/java/...
  • 手机锁屏解锁自定义View

    千次阅读 2020-09-30 19:00:55
    文章目录一、简介二、ObjectAnimator与Scroller实现比较三、 Scroller实现核心1、锁屏解锁主要有两个关键点2、触摸手机滑动带动页面进行滑动3、手指离开屏幕判断是否解锁成功4、记得重写computeScroll方法让滑动生效...
  • 这两天在公众号上偶然看到一篇关于设置动态壁纸的文章,觉得蛮有意思的,学习了一下,以此文章记录一下怎样给手机设置静态壁纸动态壁纸,设置壁纸的使用方法。静态壁纸Android中WallpaperManager系统服务用于管理...
  • ZUK 手机全屏壁纸不能自定义 但是通过自己在系统文件夹写入文件可以增加自定义的全屏壁纸 1.通过本工具制作的文件,保存到空文件夹 2.将该文件夹放到【手机存储>.keyguard>wallpaper_timey】中,即可新增壁纸 3.设置...
  • Flutter 自定义appbar并动态改变背景

    千次阅读 2019-11-27 10:18:12
    import 'package:flutter/material.dart'; import 'package:flutter_swiper/flutter_swiper.dart'; const APPBAR_SCROLL_OFFSET = 100; class HomePage extends StatefulWidget { @override ...
  • 随着科技的发展,很多人已经不再满足于静态的图片,不管是在平时的聊天还是关于手机壁纸都是如此,在聊天的时候会使用到GIF动态图,手机中的壁纸也会设置成小视频,那既然使用动态图这么频繁,怎么制作这些动态图...
  • Google Pixel 系列机型内置的航拍动态壁纸一直以来都是该系列机型的特色软件体验之一,借助自家 Google Earth 丰富的航拍照片和地图资源,Google 将地标建筑、宇宙实景等等景象以三维模型的方式重现在了手机屏幕当中...
  • 奶由手机壁纸工具.zip

    2021-08-01 12:59:26
    这是一个高颜值的安卓壁纸工具(奶由),支持动态、静态壁纸设置,文字型、可爱型、爱豆型、风景、零食等多种风格可自定义选择。除了壁纸,还拥有个性文案、花体字、头像等功能设置。
  • 实现动态壁纸是不需要使用Activity的, 创建MyWallPaper类,让其继承WallpaperService: 实现 onCreateEngine()方法,返回自己实现的Engine类,在Engine类中实现核心代码。 首先在AndroidManifest.xml中注册service->...
  • 随着最新的软件更新到版本4.50,索尼向PlayStation 4和Pro添加了一些长期以来人们所要求的功能:设置自定义壁纸的选项。 这是实现它的方法。 First, make sure your PlayStation 4 is running the latest update—...
  • android图片控制, 采用自定义view作为布局界面, 采用了simple手势来控制移动,用scale手势器来控制放缩,实现了部分边界控制避免移出屏幕, 默认使用手机屏幕壁纸作为操作图片.zip,太多无法一一验证是否可用,程序...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,856
精华内容 1,542
关键字:

如何自定义手机动态壁纸