开发实时壁纸

2024-05-07 03:58
文章标签 开发 实时 壁纸

本文主要是介绍开发实时壁纸,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

随时随地技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

所谓实时壁纸,即动态壁纸,就是手机桌面不再是简单的图片,而是运行中的动画,该动画由程序实时绘制的,所以称为实时壁纸。Android中提供WallpaperService基类来开发实时壁纸,步骤如下:

下面用一个示例来演示,该示例原型来源于疯狂讲义一书,代码如下:

WallpaperService的子类:LiveWallpaper

package com.home.service;import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Handler;
import android.service.wallpaper.WallpaperService;
import android.view.MotionEvent;
import android.view.SurfaceHolder;public class LiveWallpaper extends WallpaperService {// 继承WallpaperService必须实现的抽象方法@Overridepublic Engine onCreateEngine() {// 返回自定义的Enginereturn new MyEngine();}class MyEngine extends Engine {private int ScreenWidth;private int ScreenHeight;// 记录程序界面是否可见private boolean mVisible;// 记录当前用户事件的发生位置private float mTouchX = -1;private float mTouchY = -1;// 记录当前圆圈的绘制位置private float cx = 15;private float cy = 15;// 定义画笔private Paint mPaint = new Paint();// 定义一个HandlerHandler mHandler = new Handler();// 定义一个周期性执行的任务private final Runnable drawTarget = new Runnable() {@Overridepublic void run() {drawFrame();}};public void onCreate(android.view.SurfaceHolder surfaceHolder) {super.onCreate(surfaceHolder);// 获得屏幕宽和高ScreenWidth = getDesiredMinimumWidth() / 2;ScreenHeight = getDesiredMinimumHeight();// 初始化画笔mPaint.setColor(0xffffffff);mPaint.setAntiAlias(true);mPaint.setStrokeWidth(2);mPaint.setStrokeCap(Paint.Cap.ROUND);mPaint.setStyle(Paint.Style.STROKE);// 设置处理触摸事件setTouchEventsEnabled(true);}@Overridepublic void onDestroy() {super.onDestroy();// 删除回调mHandler.removeCallbacks(drawTarget);}@Overridepublic void onVisibilityChanged(boolean visible) {mVisible = visible;// 当界面可见时,执行drawFrame()方法if (mVisible) {// 动态绘制图形drawFrame();} else {// 如果界面不可见,删除回调mHandler.removeCallbacks(drawTarget);}}@Overridepublic void onOffsetsChanged(float xOffset, float yOffset,float xOffsetStep, float yOffsetStep, int xPixelOffset,int yPixelOffset) {drawFrame();}// 当屏幕大小改变时调用该方法@Overridepublic void onSurfaceChanged(SurfaceHolder holder, int format,int width, int height) {super.onSurfaceChanged(holder, format, width, height);drawFrame();}@Overridepublic void onSurfaceDestroyed(SurfaceHolder holder) {super.onSurfaceDestroyed(holder);mVisible = false;mHandler.removeCallbacks(drawTarget);}@Overridepublic 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 void drawFrame() {// 获取该壁纸的SurfaceHolder对象final SurfaceHolder holder = getSurfaceHolder();Canvas c = null;try {// 对画布加锁c = holder.lockCanvas();if (c != null) {c.save();// 绘制背景色c.drawColor(0xff000000);// 在触碰点绘制圆圈drawTouchPoint(c);// 绘制圆圈c.drawCircle(cx, cy, 80, mPaint);c.restore();}} finally {if (c != null) {holder.unlockCanvasAndPost(c);}}mHandler.removeCallbacks(drawTarget);// 调度下一次重绘if (mVisible) {cx += 15;cy += 20;// 如果cx、cy移出屏幕,从左上角重新开始if (cx >= ScreenWidth - 80) {cx = 15;}if (cy >= ScreenHeight - 80) {cy = 20;}// 指定0.1秒后重新执行一次drawTargetmHandler.postDelayed(drawTarget, 100);}}/*** 在屏幕触碰点绘制圆圈* * @param canvas*/private void drawTouchPoint(Canvas canvas) {if (mTouchX >= 0 && mTouchY >= 0) {canvas.drawCircle(mTouchX, mTouchY, 40, mPaint);}}}
}

配置LiveWallpaper:

        <serviceandroid:name="com.home.service.LiveWallpaper"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/mywallpaperxml"/></service>

mywallpaperxml:

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

权限:

 <!-- 加入设置壁纸权限 --><uses-permission android:name="android.permission.SET_WALLPAPER" />





 

这篇关于开发实时壁纸的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/966259

相关文章

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并