本文章主要功能是,用户根据自己的爱好选择背景图片(此应用可拓展为,定时更新手机桌面的背景图片,此处暂不实现,也许以后有空会进行实现)。
言归正传,下面说下主要的实现原理和相关技术,首先设置屏幕为全屏显示,接着调用PowerManager可以控制手机的WakeLock,让手机保持恒亮状态,同时可以设置手机屏幕亮度,此处设置为最亮(255)。
程序中实现了两个菜单项:第一个菜单为“选择背景图片”,单击会跳出一个包含图片的的AlertDialog列表,选择图片后,AlertDialog消失,主界面的背景图根据用户单击的结果进行更改;第二个菜单为“退出”,单击此按钮,软件退出,终止activity的运行。
在此,先放出效果图:
第一步:编写main.xml文件,该文件为主界面,当用户点击此应用后,第一个显示的界面。
第二步:编写对话框里面列表的子布局image_item.xml
第三步:编写对话框列表的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;
}
/**
* 获取适配内容的条数
*/
@Override
public int getCount() {
return imgs_text.length;
}
/**
* 获取相应位置的内容
*/
@Override
public Object getItem(int position) {
return imgs_text[position];
}
/**
* 根据不同位置获取相应的内容id
*/
@Override
public long getItemId(int position) {
return position;
}
@Override
public 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中取出holder
holder= (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;
@Override
protected 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);
//初始化myLayout
myLayout = (LinearLayout)findViewById(R.id.myLayout);
//获取PowerManager
powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
//获取WakeLock
wakeLock = 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);
}
/**
* 在此方法中,创建自定义的菜单选项
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//用于区分组别
int groupId = 0;
//用于区分order
int orderMenuItem1 = Menu.NONE;
int orderMenuItem2 = Menu.NONE+1;
//添加menu
menu.add(groupId, MENU_CHOOSE_COLOR, orderMenuItem1, R.string.str_select_colors);
menu.add(groupId, MENU_EXIT, orderMenuItem2, R.string.str_exit);
//设置一组菜单是否可点menu
menu.setGroupCheckable(groupId, true, true);
return super.onCreateOptionsMenu(menu);
}
/**
* 此方法中根据用户点击的不同菜单项,进行不同的响应
*/
@Override
public 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() {
@Override
public 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() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).show();
break;
//点击“退出”
case MENU_EXIT:
this.finish();
break;
}
return super.onOptionsItemSelected(item);
}
/**
* activity启动时,此方法被调用
*/
@Override
protected void onResume() {
wakeLock();
super.onResume();
}
/**
* 当activity被终止或暂停时,此方法被调用
*/
@Override
protected 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资源文件的内容:
背景选择器
Settings
荷花
家具
休闲
秋意
典雅
手提琴
美女
选择背景图片
退出
注意:别忘了给应用添加权限,在AndroidManifest.xml文件中,添加下面的权限代码:
第五步:运行程序,调试显示结果,调试过程不具体介绍,直接上图。