Safe-导航滑动页面

来源:互联网 发布:怎么改淘宝会员名手机 编辑:程序博客网 时间:2024/06/05 10:55

很多时候刚安装apk会出出现一个导航页,导航页可以实现左右滑动,切换等等操作,主要是引导一些设置,这种设置很受欢迎。

这个里面是在一个设置页面上面实现的,直接跳转activity的方式来切换导航.因为只需要一次导航,所以可以使用SharePreference中保存某一个flag来确定是不是要进行导航。由于很多导航是一样的操作,因此可以弄一个BaseActivity,这个activity不需要节面,将一些方法封装,然后通过抽象类来让子类去实现这些方法

入口页面LostAndFind.java

package com.ldw.safe.Activity;import android.app.Activity;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.view.View;import android.widget.ImageView;import android.widget.TextView;import com.ldw.safe.R;/* * 手机防盗页面 */public class LostAndFind extends Activity {private SharedPreferences mPref;private TextView tvSafePhone;private ImageView ivProtect;@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);                        //判断是否是第一次登陆,第一次登陆会进入设置向导        mPref = getSharedPreferences("config", MODE_PRIVATE);       boolean configed =  mPref.getBoolean("configed", false);       if(configed){       //进入手机放到主页面       setContentView(R.layout.activity_lostfind);       //从mPref中获取到安全号码       tvSafePhone = (TextView) findViewById(R.id.tv_safe_phone);       String phone = mPref.getString("safe_phone", "");       tvSafePhone.setText(phone);              //从mPref中获取是否是开启保护的状态,来选择后面的图片是开启还是关闭       ivProtect = (ImageView) findViewById(R.id.iv_protect);       boolean protect = mPref.getBoolean("protect", false);       if(protect){       ivProtect.setImageResource(R.drawable.lock);       }else{       ivProtect.setImageResource(R.drawable.unlock);       }              }else{       //跳转到设置向导页       startActivity(new Intent(LostAndFind.this, Setup1Activity.class));       finish();       }                     }    /*     * 重新进入设置向导     */    public void reEnter(View v){    startActivity(new Intent(LostAndFind.this, Setup1Activity.class));    finish();    }}
布局页面activity_lostfind.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="vertical" >        <TextView         style="@style/TitleStyle"        android:text="手机防盜"        />    <RelativeLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"         >        <TextView            style="@style/ContentStyle"            android:text="安全号码" />        <TextView            android:id="@+id/tv_safe_phone"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_alignParentRight="true"            android:layout_marginRight="5dp"            android:layout_centerVertical="true"            android:textSize="20sp"            android:textColor="@color/black"/>    </RelativeLayout><ImageView     android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"        android:layout_marginTop="5dp"        android:background="@drawable/listview_divider"    /><RelativeLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"         >        <TextView            style="@style/ContentStyle"            android:text="防盗保护是否开启" />        <ImageView            android:id="@+id/iv_protect"            android:layout_width="20dp"            android:layout_height="20dp"            android:layout_alignParentRight="true"            android:layout_marginRight="5dp"            android:layout_centerVertical="true"            android:src="@drawable/lock" />    </RelativeLayout><ImageView     android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"        android:layout_marginTop="5dp"        android:background="@drawable/listview_divider"    /><TextView            style="@style/ContentStyle"            android:layout_width="match_parent"            android:layout_marginRight="5dp"            android:onClick="reEnter"            android:clickable="true"            android:background="@drawable/shape_selector"            android:text="重新进入设置向导" /><ImageView     android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"        android:layout_marginTop="5dp"        android:background="@drawable/listview_divider"    />    <TextView         android:background="#885500"        android:layout_width="match_parent"        android:layout_height="wrap_content"         android:text="功能简介"        android:textSize="20sp"        android:textColor="@color/black"        android:layout_marginRight="5dp"        android:layout_marginLeft="5dp"        android:layout_marginTop="5dp"        android:padding="3dp"        />    <TextView        style="@style/ContentStyle"         android:drawableLeft="@android:drawable/star_big_on"        android:layout_gravity="center"        android:text="GPS跟踪#*Location*#"        />    <TextView        style="@style/ContentStyle"         android:drawableLeft="@android:drawable/star_big_on"        android:layout_gravity="center"        android:text="播放报警音乐#*alarm*#"        />    <TextView        style="@style/ContentStyle"         android:drawableLeft="@android:drawable/star_big_on"        android:layout_gravity="center"        android:text="远程删除数据#*wipedata*#"        />    <TextView        style="@style/ContentStyle"         android:drawableLeft="@android:drawable/star_big_on"        android:layout_gravity="center"        android:text="远程锁屏#*lookscreen*#"        /></LinearLayout>
下面的是几个切换的特效页面

Setup1Activity.java

package com.ldw.safe.Activity;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import com.ldw.safe.R;/* * 手机防盗第一个设置向导页面 */public class Setup1Activity extends BaseSetupActivity {@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_setup1);}//显示下一页,这个需要子类去实现,跳转的页面不是固定的public void showNext(){//页面跳转startActivity(new Intent(Setup1Activity.this, Setup2Activity.class));//销毁当前页面finish();//两个界面的切换动画overridePendingTransition(R.anim.tran_in, R.anim.tran_out);//进入动画和推出动画}//没有上一页,什么都不做@Overridepublic void showPrevious() {// TODO Auto-generated method stub}}
Setup2Activity.java
package com.ldw.safe.Activity;import android.app.Activity;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.telephony.TelephonyManager;import android.text.TextUtils;import android.view.GestureDetector;import android.view.GestureDetector.SimpleOnGestureListener;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.widget.Toast;import com.ldw.safe.R;import com.ldw.safe.view.SettingItemView;/* * 手机防盗第二个设置向导页面 */public class Setup2Activity extends Activity {public SharedPreferences mPref;private GestureDetector mDector;private SettingItemView siv_sim;@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_setup2);                mPref = getSharedPreferences("config", MODE_PRIVATE);                //创建手势识别器        mDector = new GestureDetector(this, new SimpleOnGestureListener(){        //监听手势滑动动作,e1是滑动的起始点,e2是滑动的终点。后2个参数是X,Y速度        @Override        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){                //获取到相对于屏幕的相对坐标,设置最小的滑动距离        //向右滑动,上一页        if((e2.getRawX() - e1.getRawX()) > 200){        showPrevious();        return true;        }                //向左滑动,下一页        if((e1.getRawX() - e2.getRawX()) > 200){        showNext();        return true;        }        return super.onFling(e1, e2, velocityX, velocityY);        }        });                //监听sim卡        siv_sim = (SettingItemView) findViewById(R.id.siv_sim);        //看一下存储的值来设置是否选中        String sim = mPref.getString("sim", null);        if(!TextUtils.isEmpty(sim)){        siv_sim.setChecked(true);        }else{        siv_sim.setChecked(false);        }        siv_sim.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {if(siv_sim.isChecked()){siv_sim.setChecked(false);//解绑sim卡的序列号mPref.edit().remove("sim").commit();}else{siv_sim.setChecked(true);//保存sim卡信息//读取sim卡的序列号TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);String simSerialNumber = tm.getSimSerialNumber();//获取到序列号System.out.println("sim卡序列号" + simSerialNumber);//保存sim卡的序列号mPref.edit().putString("sim", simSerialNumber).commit();}}                });}//显示上一页public void showPrevious(){//页面跳转startActivity(new Intent(Setup2Activity.this, Setup1Activity.class));//销毁当前页面finish();//两个界面的切换动画overridePendingTransition(R.anim.tran_previous_in, R.anim.tran_previous_out);//进入动画和推出动画}//显示下一页public void showNext(){//如果sim卡没有绑定就不让进入下一页String sim = mPref.getString("sim", null);        if(TextUtils.isEmpty(sim)){        Toast.makeText(this, "sim卡没有绑定", Toast.LENGTH_SHORT).show();        return;        }//页面跳转startActivity(new Intent(Setup2Activity.this, Setup3Activity.class));//销毁当前页面finish();//两个界面的切换动画overridePendingTransition(R.anim.tran_in, R.anim.tran_out);//进入动画和推出动画}//点击按钮跳转到下一页public void next(View v){showNext();/*//页面跳转startActivity(new Intent(Setup2Activity.this, Setup3Activity.class));//销毁当前页面finish();//两个界面的切换动画overridePendingTransition(R.anim.tran_in, R.anim.tran_out);//进入动画和推出动画*/}//点击按钮跳转到上一页public void previous(View v){showPrevious();/*//页面跳转startActivity(new Intent(Setup2Activity.this, Setup1Activity.class));//销毁当前页面finish();//两个界面的切换动画overridePendingTransition(R.anim.tran_previous_in, R.anim.tran_previous_out);//进入动画和推出动画*/}//处理手势滑动页面的处理,委托给GestureDetector手势识别器处理@Overridepublic boolean onTouchEvent(MotionEvent event){//手势识别器进行处理mDector.onTouchEvent(event);return super.onTouchEvent(event);}}
Setup3Activity.java

package com.ldw.safe.Activity;import android.app.Activity;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.text.TextUtils;import android.view.View;import android.widget.EditText;import android.widget.Toast;import com.ldw.safe.R;/* * 手机防盗第三个设置向导页面 */public class Setup3Activity extends BaseSetupActivity {private EditText etPhone;@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_setup3);                etPhone = (EditText) findViewById(R.id.et_phone);                String phone = mPref.getString("safe_phone", "");        etPhone.setText(phone);}//显示上一页,这个需要子类去实现,跳转的页面不是固定的public void showPrevious(){//页面跳转startActivity(new Intent(Setup3Activity.this, Setup2Activity.class));//销毁当前页面finish();//两个界面的切换动画overridePendingTransition(R.anim.tran_previous_in, R.anim.tran_previous_out);//进入动画和推出动画}//显示下一页,这个需要子类去实现,跳转的页面不是固定的public void showNext(){//判断是否设置安全号码,trim来过滤空格String phone = etPhone.getText().toString().trim();if(TextUtils.isEmpty(phone)){Toast.makeText(this, "安全号码不能是空", Toast.LENGTH_SHORT).show();return;}//保存安全号码mPref.edit().putString("safe_phone", phone).commit();//页面跳转startActivity(new Intent(Setup3Activity.this, Setup4Activity.class));//销毁当前页面finish();//两个界面的切换动画overridePendingTransition(R.anim.tran_in, R.anim.tran_out);//进入动画和推出动画}//选择联系人public void selectContact(View v){//跳转到ContactActivity界面,同时返回数据Intent intent = new Intent(this, ContactActivity.class);startActivityForResult(intent, 0);}@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data){//如果请求码是ok的时候才会去获取回传的数据if(resultCode == Activity.RESULT_OK){String phone = data.getStringExtra("phone");//把电话号码里面的-去掉,并将空格去掉phone = phone.replaceAll("-", "").replaceAll(" ", "");//把返回的电话号码设置到输入框etPhone.setText(phone);//}super.onActivityResult(requestCode, resultCode, data);}}
Setup4Activity.java
package com.ldw.safe.Activity;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.CompoundButton.OnCheckedChangeListener;import com.ldw.safe.R;/* * 手机防盗第四个设置向导页面 */public class Setup4Activity extends BaseSetupActivity {private CheckBox cbProtect;@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_setup4);                cbProtect = (CheckBox) findViewById(R.id.cb_protect);                //根据保存的状态保存是否开启       boolean protect = mPref.getBoolean("protect", false);       if(protect){       cbProtect.setText("防盗保护已经开启");       cbProtect.setChecked(true);       }else{       cbProtect.setText("防盗保护没有开启");       cbProtect.setChecked(false);       }               //监听checkBox,并保存checkbox状态        cbProtect.setOnCheckedChangeListener(new OnCheckedChangeListener(){@Overridepublic void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {if(isChecked){cbProtect.setText("防盗保护已经开启");mPref.edit().putBoolean("protect", true).commit();}else{cbProtect.setText("防盗保护没有开启");mPref.edit().putBoolean("protect", false).commit();}}                });}//显示上一页,这个需要子类去实现,跳转的页面不是固定的public void showPrevious(){//页面跳转startActivity(new Intent(Setup4Activity.this, Setup3Activity.class));//销毁当前页面finish();//两个界面的切换动画overridePendingTransition(R.anim.tran_previous_in, R.anim.tran_previous_out);//进入动画和推出动画}//显示下一页,这个需要子类去实现,跳转的页面不是固定的public void showNext(){//页面跳转startActivity(new Intent(Setup4Activity.this, LostAndFind.class));//销毁当前页面finish();//更新mPref表示已经展示过设置向导,下次进来不展示更新向导mPref.edit().putBoolean("configed", true).commit();//两个界面的切换动画overridePendingTransition(R.anim.tran_in, R.anim.tran_out);//进入动画和推出动画}}
公共activity==BaseActivity.jav

package com.ldw.safe.Activity;import com.ldw.safe.R;import android.app.Activity;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;import android.view.GestureDetector.SimpleOnGestureListener;/* * 设置引导页面的父类,这个基类不需要在Manifist文件中注册,因为其不需要展示 * 里面有抽象方法,类设置成抽象类 */public abstract class BaseSetupActivity extends Activity {public SharedPreferences mPref;private GestureDetector mDector;@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_setup2);                mPref = getSharedPreferences("config", MODE_PRIVATE);              //创建手势识别器        mDector = new GestureDetector(this, new SimpleOnGestureListener(){        //监听手势滑动动作,e1是滑动的起始点,e2是滑动的终点。后2个参数是X,Y速度        @Override        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){                //防止上滑动和下滑动幅度过大,不让切换        if(Math.abs(e2.getRawY() - e1.getRawY()) > 200){        return true;        }                //滑动的速度不能太慢        if(Math.abs(velocityX) < 100){        return true;        }        //获取到相对于屏幕的相对坐标,设置最小的滑动距离        //向右滑动,上一页        if((e2.getRawX() - e1.getRawX()) > 200){        showPrevious();        return true;        }                //向左滑动,下一页        if((e1.getRawX() - e2.getRawX()) > 200){        showNext();        return true;        }        return super.onFling(e1, e2, velocityX, velocityY);        }        });}//显示上一页,这个需要子类去实现,跳转的页面不是固定的,抽象方法,强制子类去实现public abstract void showPrevious();//显示下一页,这个需要子类去实现,跳转的页面不是固定的public abstract void showNext();//点击按钮跳转到下一页public void next(View v){showNext();/*//页面跳转startActivity(new Intent(Setup2Activity.this, Setup3Activity.class));//销毁当前页面finish();//两个界面的切换动画overridePendingTransition(R.anim.tran_in, R.anim.tran_out);//进入动画和推出动画*/}//点击按钮跳转到上一页public void previous(View v){showPrevious();/*//页面跳转startActivity(new Intent(Setup2Activity.this, Setup1Activity.class));//销毁当前页面finish();//两个界面的切换动画overridePendingTransition(R.anim.tran_previous_in, R.anim.tran_previous_out);//进入动画和推出动画*/}//处理手势滑动页面的处理,委托给GestureDetector手势识别器处理@Overridepublic boolean onTouchEvent(MotionEvent event){//手势识别器进行处理mDector.onTouchEvent(event);return super.onTouchEvent(event);}}