本文章主要功能是,用户根据自己的爱好选择背景图片(此应用可拓展为,定时更新手机桌面的背景图片,此处暂不实现,也许以后有空会进行实现)。

言归正传,下面说下主要的实现原理和相关技术,首先设置屏幕为全屏显示,接着调用PowerManager可以控制手机的WakeLock,让手机保持恒亮状态,同时可以设置手机屏幕亮度,此处设置为最亮(255)。

程序中实现了两个菜单项:第一个菜单为“选择背景图片”,单击会跳出一个包含图片的的AlertDialog列表,选择图片后,AlertDialog消失,主界面的背景图根据用户单击的结果进行更改;第二个菜单为“退出”,单击此按钮,软件退出,终止activity的运行。

在此,先放出效果图:

第一步:编写main.xml文件,该文件为主界面,当用户点击此应用后,第一个显示的界面。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/myLayout"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/main_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:textSize="25sp"android:text="点击菜单选择背景图片" />
</LinearLayout>

第二步:编写对话框里面列表的子布局image_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><ImageView android:id="@+id/item_img"android:layout_width="30dp"android:layout_height="30dp"android:layout_margin="5dp"android:src="@drawable/b01"android:layout_gravity="center_vertical"/><TextView android:id="@+id/item_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:text="图片"android:paddingLeft="30dp"android:layout_gravity="center_vertical"/>
</LinearLayout>

第三步:编写对话框列表的MyAdapter.java

package com.zyz.wake.adapter;import com.zyz.wake.R;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
/*** 该适配器继承BaseAdapter,用于适配*/
public class MyAdapter extends BaseAdapter {//该实例用于将layout的xml布局文件实例化为View类对象private LayoutInflater layoutInflater;//图片数组private int[] imgs;//与图片数组对应的图片名private int[] imgs_text;/*** 构造函数初始化实例对象和数据*/public MyAdapter(Context context,int[] imgs,int[] imgs_text){layoutInflater = LayoutInflater.from(context);this.imgs = imgs;this.imgs_text = imgs_text;}/*** 获取适配内容的条数*/@Overridepublic int getCount() {return imgs_text.length;}/*** 获取相应位置的内容*/@Overridepublic Object getItem(int position) {return imgs_text[position];}/*** 根据不同位置获取相应的内容id*/@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//该内部类对象可用于重复使用textview,使应用得到优化ViewHolder holder;//如果convertView不存在,通过layoutInflater获取一个布局对象,//同时将内部类对象holder通过tag添加到convertView中if(convertView == null){convertView = layoutInflater.inflate(R.layout.image_item, null);holder = new ViewHolder();holder.img = (ImageView)convertView.findViewById(R.id.item_img);holder.tv = (TextView)convertView.findViewById(R.id.item_tv);//给convertView添加一个格外的数据,以后可以用getTag()将这个数据取出来convertView.setTag(holder);}else{//如果convertView已经存在,直接从convertView中取出holderholder= (ViewHolder)convertView.getTag();}holder.img.setImageResource(imgs[position]);//设置holder的内容holder.tv.setText(imgs_text[position]);//将convertView返回给调用者return convertView;}/*** 内部类,用于内存数据优化*/private class ViewHolder{private ImageView img;private TextView tv;}
}

第四步:完成以上步骤之后,可以开始着手编写主Activity,MainActivity.java文件

package com.zyz.wake;import com.zyz.wake.adapter.MyAdapter;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.graphics.Color;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity {//常量用于标记菜单栏的识别事件private static final int MENU_CHOOSE_COLOR=Menu.FIRST;private static final int MENU_EXIT = Menu.FIRST+1;//定义不同的图片和图片的名字private int[] imgs = {R.drawable.b01,R.drawable.b02,R.drawable.b03,R.drawable.b04,R.drawable.b05,R.drawable.b06,R.drawable.b07};private int[] imgs_text = {R.string.str_b01,R.string.str_b02,R.string.str_b03,R.string.str_b04,R.string.str_b05,R.string.str_b06,R.string.str_b07};//用于判断是否锁定状态,true表示未锁状态,false表示锁定状态private boolean ifLocked = false;//手机电源管理器private PowerManager powerManager;//Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠,可以被用户态程序和内核获得private WakeLock wakeLock;//布局对象,用于控制选择背景图片private LinearLayout myLayout;//主界面显示的文字private TextView mainTV;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设置无标题requestWindowFeature(Window.FEATURE_NO_TITLE);//设置全屏显示getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);setContentView(R.layout.main);//初始化myLayoutmyLayout = (LinearLayout)findViewById(R.id.myLayout);//获取PowerManagerpowerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);//获取WakeLockwakeLock = powerManager.newWakeLock(powerManager.SCREEN_BRIGHT_WAKE_LOCK, "backLight");//主界面显示的文字mainTV = (TextView)findViewById(R.id.main_tv);WindowManager.LayoutParams lp = getWindow().getAttributes();//设置屏幕亮度lp.screenBrightness = 1.0f;getWindow().setAttributes(lp);}/*** 在此方法中,创建自定义的菜单选项*/@Overridepublic boolean onCreateOptionsMenu(Menu menu) {//用于区分组别int groupId = 0;//用于区分orderint orderMenuItem1 = Menu.NONE;int orderMenuItem2 = Menu.NONE+1;//添加menumenu.add(groupId, MENU_CHOOSE_COLOR, orderMenuItem1, R.string.str_select_colors);menu.add(groupId, MENU_EXIT, orderMenuItem2, R.string.str_exit);//设置一组菜单是否可点menumenu.setGroupCheckable(groupId, true, true);return super.onCreateOptionsMenu(menu);}/*** 此方法中根据用户点击的不同菜单项,进行不同的响应*/@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {//点击“选择背景图片”case MENU_CHOOSE_COLOR://创建一个对话框,显示各种不同的背景,让用户自己选择new AlertDialog.Builder(MainActivity.this).setTitle(getResources().getString(R.string.str_select_colors)).setAdapter(new MyAdapter(MainActivity.this, imgs, imgs_text), new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//根据用户点击的结果,显示相应的背景图片myLayout.setBackgroundResource(imgs[which]);//根据用户点击的结果,显示相应的图片名mainTV.setText("");//向用户提示选择的结果信息Toast.makeText(MainActivity.this, imgs_text[which], Toast.LENGTH_SHORT).show();}}).setPositiveButton("取消", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}}).show();break;//点击“退出”case MENU_EXIT:this.finish();break;}return super.onOptionsItemSelected(item);}/*** activity启动时,此方法被调用*/@Overrideprotected void onResume() {wakeLock();super.onResume();}/*** 当activity被终止或暂停时,此方法被调用*/@Overrideprotected void onStop() {wakeUnlock();super.onStop();}/*** wakeLock释放*/private void wakeUnlock() {if(ifLocked){ifLocked = false;wakeLock.release();}}/*** 调用wakeLock,让屏幕保持恒亮状态*/private void wakeLock() {if(!ifLocked){ifLocked = true;wakeLock.acquire();}}
}

下面贴出使用到的strings.xml资源文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<resources><string name="app_name">背景选择器</string><string name="action_settings">Settings</string><!-- 颜色数组名 --><string name="str_b01">荷花</string><string name="str_b02">家具</string><string name="str_b03">休闲</string><string name="str_b04">秋意</string><string name="str_b05">典雅</string><string name="str_b06">手提琴</string><string name="str_b07">美女</string><!-- 菜单名 --><string name="str_select_colors">选择背景图片</string><string name="str_exit">退出</string></resources>

注意:别忘了给应用添加权限,在AndroidManifest.xml文件中,添加下面的权限代码:

<uses-permission android:name="android.permission.WAKE_LOCK"/>

第五步:运行程序,调试显示结果,调试过程不具体介绍,直接上图。

碎步一:根据用户喜好选择不同背景图(背景选择器)相关推荐

  1. 【短视频运营】账号主页搭建 ② ( 视频封面 | 头像 | 背景图 )

    文章目录 一.视频封面 二.头像 三.背景图 账号主页 中的 昵称.个人简介.视频封面.头像.背景图 等 , 都可以携带信息 , 搭建好账号主页 , 可以增加用户进入主页后关注的概率 ; 一.视频封面 ...

  2. 设计背景图的效果主要体现在那几个方面?

    设计背景图在整个设计中站的地位效果是很大的,即使是一个纯白色的背景也对设计的整体有很大的影响,如果你对设计背景图这方面话有点欠缺的化不妨看看. 设计背景图的效果主要体现在那几个方面? 1.凸显主体 背 ...

  3. html让背景图铺满整个页面

    html让背景图铺满整个页面 <style> body {background:url("zz.jpeg") no-repeat center center; /*加载 ...

  4. CSS基础-02 background(背景色)(背景色 background-color、背景图 background-image)

    文章目录 1. 背景色 1.1 语法 1.2 示例 2. 背景图 1.1 语法 使用背景图 背景图位置 固定背景图(不随页面滚动) 1.2 示例 1. 背景色 1.1 语法 background-co ...

  5. 【教程】Spire.PDF教程:如何给PDF添加背景颜色和平铺背景图

    Spire.PDF是一个专业的PDF组件,能够独立地创建.编写.编辑.操作和阅读PDF文件,支持 .NET.Java.WPF和Silverlight.Spire.PDF的PDF API拥有丰富的功能, ...

  6. 前端背景图放置_前端开发关于网页背景图片的缩放自适应及组合形成背景图的问题...

    前端游戏开发贴吧 游戏前端开发 游戏开发流程 策划美术前端后端 昨天在切图时遇到如下两个问题: 1.需要背景图片无论浏览器大小如何缩放,背景图片始终宽度百分百显示. 2.需要将给出的一张背景图片和一张 ...

  7. 应用下载店用户喜好分析

    应用下载店绝对是2008和2009年度通讯行业最重要的关键词之一.Apple AppStore,MicroSoft Windows Marketplace,Nokia OviStore, Google ...

  8. 微软为NBA提供云计算服务、Google公布Fuchsia OS细节、Zoom用户可选择数据库等|Decode the Week...

    Decode the Week≠音视频技术周刊  01 苹果正在研发可替换零部件的入耳式无线耳机 并发布了Apple Music Web版 彭博社消息,苹果试图通过高端音频产品扩大AirPods业务, ...

  9. win10——microsoft同步用户主题桌面背景的本地位置、默认背景位置、双屏双背景图设置

    漫游的桌面背景(把地址直接复制到文件管理系统地址栏中ENTER即可直达) 是针对用户帐户而言的,所以所有通过microsoft帐户同步过来的数据基本都在当前用户目录下,即"%userprof ...

最新文章

  1. golang 命令行_如何使用Golang编写快速有趣的命令行应用程序
  2. 联手中科大、浙大、华科大等高校,阿里研发4项最新AI安全技术
  3. keras网络变为pytorch网络的一些参考
  4. riak文件服务器,Docker中运行Riak服务 - Docker 中文指南
  5. Flutter ListView封装,下拉刷新、上拉加载更多
  6. java图像处理之图像融合
  7. struts2文件上传中,如何限制上传的文件类型
  8. 【CodeForces - 1197C】Array Splitting(水题)
  9. Qt如何调用VS编写的动态链接库(dll文件)
  10. ffmpeg系列-编译
  11. 排除包_冷水机压缩机压缩机常见故障和排除方法
  12. 深度之眼 alexnet_AlexNet带给了深度学习的世界
  13. 3,graph语法学习
  14. 双十一电商对决,拍拍微店这次会怎么玩?
  15. Telink blt_soft_timer 改进
  16. c语言iq测试,IQ智商测试题
  17. c语言atan,C语言atan()函数:求正切值为 x 的弧度数
  18. 腾讯云开放mysql端口_腾讯云服务器Mysql开启3306端口远程访问
  19. vivado ILA核使用教程
  20. Unity3d模型,加入Animator后,播放动画,物体回归原位处理

热门文章

  1. 杭电acm1062Text Reverse
  2. SQL*PLUS的异常处理-SP2-0606
  3. java毕业设计家校通管理系统(附源码、数据库)
  4. 苹果7全网通经常显示无服务器,抖音教会我8个iPhone隐藏技巧,就连苹果老用户也未必全知道...
  5. 60台无盘服务器配置,网咖好搭档 维盟WS6012W全万兆星网解决方案
  6. 微商:营销要有正确的思路
  7. Android2019年必须知道的史上最全框架、最全开源App(高级开发人员必看,面试必看)
  8. 如何在腾讯会议开演讲者模式下,投影仪不显示演讲者模式
  9. 隐藏windows 登录_如何在Windows 10登录屏幕上隐藏您的个人信息
  10. js判断鼠标滚轮上下滚动