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

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

言归正传,下面说下主要的实现原理和相关技术,首先设置屏幕为全屏显示,接着调用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">
    <TextView
        android: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;
	}
	/**
	 * 获取适配内容的条数
	 */
	@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资源文件的内容:

<?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"/>

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






 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值