手机防盗向导页构建
手机防盗页面逻辑
输入密码成功后
根据是否设置完成四个导航界面决定跳转到导航界面一,还是手机防盗列表界面
1,跳转到导航界面的第1个,描述功能
跳转到导航界面的第2个,必须,绑定sim卡,才可以跳转到第三个界面 跳转到导航界面的第3个,必须输入电话号码,(两种途径(1,输入2,选择)) 跳转到导航界面的第4个,手机防盗的总开关,开启
2,手机防盗功能列表界面
展示导航界面三已选中手机联系人号码 展示是否开启防盗保护 重新对导航界面设置
selector
图片选择器,实现按钮点击放开不同图片
selector放置的路径res/drawable/selector.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/button_pressed" /> <!-- 选中按钮图片 -->
<item android:state_focused="true"
android:drawable="@drawable/button_focused" /> <!-- 按钮获取焦点图片 -->
<item android:state_hovered="true"
android:drawable="@drawable/button_focused" /> <!-- 平板电视,悬浮选中某个应用图片 -->
<item android:drawable="@drawable/button_normal" /> <!-- 默认图片-->
</selector>
使用selector
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@drawable/selector" />
9patch
为什么要用点9图片?因为android手机分辨率不同,因此要按需求自动拉伸图片。
制作9Patch图的工具位于 sdk/tools/draw9patch.bat
*.9.png
- 上边线控制水平拉伸
- 左边线控制竖直拉伸
- 右边线和下边线控制内容区域
页面平移动画
下一页,上一页使用平移动画
原理图:
上一页移入activity:
(-屏幕宽度,y)------>(0,y)
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="-100%p"
android:toXDelta="0"
android:duration="500">
</translate>
上一页移出activity:
(0,y)-------------->(屏幕宽度,y)
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="100%p"
android:duration="500">
</translate>
调用:
int enterAnim=R.anim.trans_pre_in;
int exitAnim=R.anim.trans_pre_out;
overridePendingTransition(enterAnim, exitAnim);
下一页移入activity:
(屏幕宽度,y)-------------->(0,y)
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="100%p"
android:toXDelta="0"
android:duration="500">
</translate>
下一页移出activity:
(0,y)————–>(-屏幕宽度,y)
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="-100%p"
android:duration="500">
</translate>
调用:
int enterAnim=R.anim.trans_next_in;
int exitAnim=R.anim.trans_next_out;
overridePendingTransition(enterAnim, exitAnim);
下一页移入动画 (屏幕宽度,y)-------------->(0,y)
下一页移出动画 (0,y)-------------->(-屏幕宽度,y)
防盗页布局与示例代码
第一页
布局
<?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="vertical" >
<TextView
style="@style/TitleStyle"
android:text="1,欢迎使用手机防盗"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="18sp"
android:layout_margin="5dp"
android:text="您的手机防盗卫士:"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="18sp"
android:gravity="center_vertical"
android:drawableLeft="@android:drawable/star_big_on"
android:text="sim卡变更报警"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="18sp"
android:gravity="center_vertical"
android:drawableLeft="@android:drawable/star_big_on"
android:text="GPS追踪"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="18sp"
android:gravity="center_vertical"
android:drawableLeft="@android:drawable/star_big_on"
android:text="远程数据销毁"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="18sp"
android:gravity="center_vertical"
android:drawableLeft="@android:drawable/star_big_on"
android:text="远程锁屏"/>
<!-- 让内部点的控件水平居中 -->
<LinearLayout
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:background="@android:drawable/presence_online"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:background="@android:drawable/presence_invisible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:background="@android:drawable/presence_invisible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:background="@android:drawable/presence_invisible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:background="@drawable/setup1"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<!-- 图片选择器,在选中和未选中的过程中,切换展示图片 -->
<Button
style="@style/nextBtn"/>
</RelativeLayout>
</LinearLayout>
代码
public class Setup1Activity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setup1);
}
public void nextPage(View view){
Intent intent = new Intent(getApplicationContext(), Setup2Activity.class);
startActivity(intent);
finish();
//开启平移动画
overridePendingTransition(R.anim.next_in_anim, R.anim.next_out_anim);
}
}
第二页
布局
<?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="vertical" >
<TextView
style="@style/TitleStyle"
android:text="2,手机卡绑定"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="18sp"
android:layout_margin="5dp"
android:text="通过绑定sim卡:\n下次重启手机如果发现sim卡变化,就会发送报警短信"/>
<!-- 自定义组合控件 -->
<com.itheima.mobilesafe74.view.SettingItemView
xmlns:mobilesafe="http://schemas.android.com/apk/res/com.itheima.mobilesafe74"
android:id="@+id/siv_sim_bound"
android:layout_width="match_parent"
android:layout_height="wrap_content"
mobilesafe:destitle="点击绑定sim卡"
mobilesafe:desoff="sim卡未绑定"
mobilesafe:deson="sim卡已绑定">
</com.itheima.mobilesafe74.view.SettingItemView>
<!-- 让内部点的控件水平居中 -->
<LinearLayout
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:background="@android:drawable/presence_invisible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:background="@android:drawable/presence_online"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:background="@android:drawable/presence_invisible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:background="@android:drawable/presence_invisible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:background="@drawable/bind"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<!-- 图片选择器,在选中和未选中的过程中,切换展示图片 -->
<Button
style="@style/preBtn"/>
<Button
style="@style/nextBtn"/>
</RelativeLayout>
</LinearLayout>
代码
package com.itheima.mobilesafe74.activity;
import com.itheima.mobilesafe74.R;
import com.itheima.mobilesafe74.utils.ConstantValue;
import com.itheima.mobilesafe74.utils.SpUtil;
import com.itheima.mobilesafe74.utils.ToastUtil;
import com.itheima.mobilesafe74.view.SettingItemView;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
public class Setup2Activity extends Activity {
private SettingItemView siv_sim_bound;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setup2);
initUI();
}
private void initUI() {
siv_sim_bound = (SettingItemView) findViewById(R.id.siv_sim_bound);
//1,回显(读取已有的绑定状态,用作显示,sp中是否存储了sim卡的序列号)
String sim_number = SpUtil.getString(this, ConstantValue.SIM_NUMBER, "");
//2,判断是否序列卡号为""
if(TextUtils.isEmpty(sim_number)){
siv_sim_bound.setCheck(false);
}else{
siv_sim_bound.setCheck(true);
}
siv_sim_bound.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//3,获取原有的状态
boolean isCheck = siv_sim_bound.isCheck();
//4,将原有状态取反
//5,状态设置给当前条目
siv_sim_bound.setCheck(!isCheck);
if(!isCheck){
//6,存储(序列卡号)
//6.1获取sim卡序列号TelephoneManager
TelephonyManager manager = (TelephonyManager)
getSystemService(Context.TELEPHONY_SERVICE);
//6.2获取sim卡的序列卡号
String simSerialNumber = manager.getSimSerialNumber();
//6.3存储
SpUtil.putString(getApplicationContext(), ConstantValue.SIM_NUMBER, simSerialNumber);
}else{
//7,将存储序列卡号的节点,从sp中删除掉
SpUtil.remove(getApplicationContext(), ConstantValue.SIM_NUMBER);
}
}
});
}
public void nextPage(View view){
String serialNumber = SpUtil.getString(this, ConstantValue.SIM_NUMBER, "");
if(!TextUtils.isEmpty(serialNumber)){
Intent intent = new Intent(getApplicationContext(), Setup3Activity.class);
startActivity(intent);
finish();
overridePendingTransition(R.anim.next_in_anim, R.anim.next_out_anim);
}else{
ToastUtil.show(this,"请绑定sim卡");
}
}
public void prePage(View view){
Intent intent = new Intent(getApplicationContext(), Setup1Activity.class);
startActivity(intent);
finish();
overridePendingTransition(R.anim.pre_in_anim, R.anim.pre_out_anim);
}
}
第三页
布局
<?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="vertical" >
<TextView
style="@style/TitleStyle"
android:text="3,设置安全号码"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="18sp"
android:layout_margin="5dp"
android:text="sim变更后\n就会发送报警短信至安全号码"/>
<EditText
android:id="@+id/et_phone_number"
android:hint="请输入电话号码"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/bt_select_number"
android:background="@drawable/selector_number_btn_bg"
android:text="选择联系人"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<!-- 让内部点的控件水平居中 -->
<LinearLayout
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:background="@android:drawable/presence_invisible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:background="@android:drawable/presence_invisible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:background="@android:drawable/presence_online"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:background="@android:drawable/presence_invisible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:background="@drawable/bind"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<!-- 图片选择器,在选中和未选中的过程中,切换展示图片 -->
<Button
style="@style/preBtn"/>
<Button
style="@style/nextBtn"/>
</RelativeLayout>
</LinearLayout>
代码
public class Setup3Activity extends Activity {
private EditText et_phone_number;
private Button bt_select_number;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setup3);
initUI();
}
private void initUI() {
//显示电话号码的输入框
et_phone_number = (EditText) findViewById(R.id.et_phone_number);
//获取联系人电话号码回显过程
String phone = SpUtil.getString(this, ConstantValue.CONTACT_PHONE, "");
et_phone_number.setText(phone);
//点击选择联系人的对话框
bt_select_number = (Button) findViewById(R.id.bt_select_number);
bt_select_number.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), ContactListActivity.class);
startActivityForResult(intent, 0);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(data!=null){
//1,返回到当前界面的时候,接受结果的方法
String phone = data.getStringExtra("phone");
//2,将特殊字符过滤(中划线转换成空字符串)
phone = phone.replace("-", "").replace(" ", "").trim();
et_phone_number.setText(phone);
//3,存储联系人至sp中
SpUtil.putString(getApplicationContext(), ConstantValue.CONTACT_PHONE, phone);
}
super.onActivityResult(requestCode, resultCode, data);
}
public void nextPage(View view){
//点击按钮以后,需要获取输入框中的联系人,再做下一页操作
String phone = et_phone_number.getText().toString();
//在sp存储了相关联系人以后才可以跳转到下一个界面
// String contact_phone = SpUtil.getString(getApplicationContext(), ConstantValue.CONTACT_PHONE, "");
if(!TextUtils.isEmpty(phone)){
Intent intent = new Intent(getApplicationContext(), Setup4Activity.class);
startActivity(intent);
finish();
//如果现在是输入电话号码,则需要去保存
SpUtil.putString(getApplicationContext(), ConstantValue.CONTACT_PHONE, phone);
overridePendingTransition(R.anim.next_in_anim, R.anim.next_out_anim);
}else{
ToastUtil.show(this,"请输入电话号码");
}
}
public void prePage(View view){
Intent intent = new Intent(getApplicationContext(), Setup2Activity.class);
startActivity(intent);
finish();
overridePendingTransition(R.anim.pre_in_anim, R.anim.pre_out_anim);
}
}
联系人
public class ContactListActivity extends Activity {
protected static final String tag = "ContactListActivity";
private ListView lv_contact;
private List<HashMap<String,String>> contactList = new ArrayList<HashMap<String,String>>();
private MyAdapter mAdapter;
private Handler mHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
//8,填充数据适配器
mAdapter = new MyAdapter();
lv_contact.setAdapter(mAdapter);
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contact_list);
initUI();
initData();
}
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return contactList.size();
}
@Override
public HashMap<String, String> getItem(int position) {
return contactList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = View.inflate(getApplicationContext(), R.layout.listview_contact_item, null);
TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);
tv_name.setText(getItem(position).get("name"));
tv_phone.setText(getItem(position).get("phone"));
return view;
}
}
/**
* 获取系统联系人数据方法
*/
private void initData() {
//因为读取系统联系人,可能是一个耗时操作,放置到子线程中处理
new Thread(){
public void run() {
//1,获取内容解析器对象
ContentResolver contentResolver = getContentResolver();
//2,做查询系统联系人数据库表过程(读取联系人权限)
Cursor cursor = contentResolver.query(
Uri.parse("content://com.android.contacts/raw_contacts"),
new String[]{"contact_id"},
null, null, null);
contactList.clear();
//3,循环游标,直到没有数据为止
while(cursor.moveToNext()){
String id = cursor.getString(0);
// Log.i(tag, "id = "+id);
//4,根据用户唯一性id值,查询data表和mimetype表生成的视图,获取data以及mimetype字段
Cursor indexCursor = contentResolver.query(
Uri.parse("content://com.android.contacts/data"),
new String[]{"data1","mimetype"},
"raw_contact_id = ?", new String[]{id}, null);
//5,循环获取每一个联系人的电话号码以及姓名,数据类型
HashMap<String, String> hashMap = new HashMap<String, String>();
while(indexCursor.moveToNext()){
String data = indexCursor.getString(0);
String type = indexCursor.getString(1);
//6,区分类型去给hashMap填充数据
if(type.equals("vnd.android.cursor.item/phone_v2")){
//数据非空判断
if(!TextUtils.isEmpty(data)){
hashMap.put("phone", data);
}
}else if(type.equals("vnd.android.cursor.item/name")){
if(!TextUtils.isEmpty(data)){
hashMap.put("name", data);
}
}
}
indexCursor.close();
contactList.add(hashMap);
}
cursor.close();
//7,消息机制,发送一个空的消息,告知主线程可以去使用子线程已经填充好的数据集合
mHandler.sendEmptyMessage(0);
};
}.start();
}
private void initUI() {
lv_contact = (ListView) findViewById(R.id.lv_contact);
lv_contact.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
//1,获取点中条目的索引指向集合中的对象
if(mAdapter!=null){
HashMap<String, String> hashMap = mAdapter.getItem(position);
//2,获取当前条目指向集合对应的电话号码
String phone = hashMap.get("phone");
//3,此电话号码需要给第三个导航界面使用
//4,在结束此界面回到前一个导航界面的时候,需要将数据返回过去
Intent intent = new Intent();
intent.putExtra("phone", phone);
setResult(0, intent);
finish();
}
}
});
}
}
第四页
布局
<?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="vertical" >
<TextView
style="@style/TitleStyle"
android:text="4,恭喜您,设置完成"/>
<CheckBox
android:id="@+id/cb_box"
android:text="您没有开启防盗保护"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<!-- 让内部点的控件水平居中 -->
<LinearLayout
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:background="@android:drawable/presence_invisible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:background="@android:drawable/presence_invisible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:background="@android:drawable/presence_invisible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:background="@android:drawable/presence_online"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:background="@drawable/phone"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<!-- 图片选择器,在选中和未选中的过程中,切换展示图片 -->
<Button
style="@style/preBtn"/>
<Button
style="@style/nextBtn"/>
</RelativeLayout>
</LinearLayout>
代码
public class Setup4Activity extends Activity {
private CheckBox cb_box;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setup4);
initUI();
}
private void initUI() {
cb_box = (CheckBox) findViewById(R.id.cb_box);
//1,是否选中状态的回显
boolean open_security = SpUtil.getBoolean(this, ConstantValue.OPEN_SECURITY, false);
//2,根据状态,修改checkbox后续的文字显示
cb_box.setChecked(open_security);
if(open_security){
cb_box.setText("安全设置已开启");
}else{
cb_box.setText("安全设置已关闭");
}
// cb_box.setChecked(!cb_box.isChecked());
//3,点击过程中,监听选中状态发生改变过程,
cb_box.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//4,isChecked点击后的状态,存储点击后状态
SpUtil.putBoolean(getApplicationContext(), ConstantValue.OPEN_SECURITY, isChecked);
//5,根据开启关闭状态,去修改显示的文字
if(isChecked){
cb_box.setText("安全设置已开启");
}else{
cb_box.setText("安全设置已关闭");
}
}
});
}
public void nextPage(View view){
boolean open_security = SpUtil.getBoolean(this, ConstantValue.OPEN_SECURITY, false);
if(open_security){
Intent intent = new Intent(getApplicationContext(), SetupOverActivity.class);
startActivity(intent);
finish();
SpUtil.putBoolean(this, ConstantValue.SETUP_OVER, true);
overridePendingTransition(R.anim.next_in_anim, R.anim.next_out_anim);
}else{
ToastUtil.show(getApplicationContext(), "请开启防盗保护");
}
}
public void prePage(View view){
Intent intent = new Intent(getApplicationContext(), Setup3Activity.class);
startActivity(intent);
finish();
overridePendingTransition(R.anim.pre_in_anim, R.anim.pre_out_anim);
}
}