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

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

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

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

        在此,先放出效果图:

碎步一:根据用户喜好选择不同背景图(背景选择器)_第1张图片

第一步:编写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文件中,添加下面的权限代码:

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

碎步一:根据用户喜好选择不同背景图(背景选择器)_第2张图片





 

你可能感兴趣的:(Android开发)