Safe-滑动页面(Setup2Activity)-手势识别器

Setup2Activity.java的功能有点击上一页案件和下一页按键实现activity的切换,支持手势识别器,实现左右滑动。

GestureDetector可以控制手对Android的屏幕的触碰的识别,比如滑动的时候,页面会左右移动,会根据手势滑动的动作进行监听,当滑动的距离大于200的时候才会切换界面。在最下面的基类BaseSetupActivity.java中队滑动添加了一些其他的限制比如滑动的速度,滑动的Y轴距离等。

//创建手势识别器
        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卡,SIM卡的布局继承了自定义的布局,以及自定义的属性,siv_sim.setChecked调用的时候会显示不同的内容,在SharesPreference里面来保存SIM卡是否选择监听。选择监听的时候会获取到SIM卡的一些信息,比如序列号,读取了一会保存在SharePreference里面。这个时候需要添加权限

权限代码

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
参考代码

//监听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(){

			@Override
			public 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();
				}
				
			}
        	
        });
	}

同时在开机的时候监听开机的广播,当SIM卡状态发生变化的时候发送开机SIM变化的广播。首先获取到SharePreference的存储的值,然后判断开机以后的SIM卡和当前在SharePreference里面保存的卡是否是一致,当不一致的时候和保存的安全号码发送短信。

package com.ldw.safe.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;

/*
 * 监听手机开机启动的广播
 */
public class BootCompletedReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		SharedPreferences mPref = context.getSharedPreferences("config", Context.MODE_PRIVATE);
		
		//防盗保护开启的时候才做下面的处理
		boolean protect = mPref.getBoolean("protect", false);
		if(protect){
			
			String sim = mPref.getString("sim", null);//获取绑定的sim卡的信息
			
			if(!TextUtils.isEmpty(sim)){
	        	//获取当前的sim卡
				TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
				String currentSim = tm.getSimSerialNumber();
				//比较序列号是否一致
				if(sim.equals(currentSim)){
					System.out.println("手机安全");
				}else{
					System.out.println("sim卡变更了");
					//获取到保存的安全号码
					String phone = mPref.getString("safe_phone", null);
					SmsManager smsManager = SmsManager.getDefault();
					//向安全号码发送信息
					smsManager.sendTextMessage(phone, null, "sim card hs changerd", null, null);
				}
	        }
		}
		

		
	}

}

总的逻辑代码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(){

			@Override
			public 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手势识别器处理
	@Override
	public boolean onTouchEvent(MotionEvent event){
		//手势识别器进行处理
		mDector.onTouchEvent(event);
		return super.onTouchEvent(event);
		
	}
}

当要切换的类似的功能的activity多了以后可以创建一个公共的activity来继承一些一样的方法。这种activity不需要在清单文件中注册,因为这个activity不需要显示,一些需要各自独立实现但又是类似的方法设置成abstract抽象方法,这样让子类分别去自己去实现。

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手势识别器处理
		@Override
		public boolean onTouchEvent(MotionEvent event){
			//手势识别器进行处理
			mDector.onTouchEvent(event);
			return super.onTouchEvent(event);
			
		}
	
	

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
启动提示说明<br/>如何安装, 设定及使用光驱,同时列出支援的硬体.<br/>如何在 Linux 的系统上使用中文?/TD> <br/>如何更加快速简便地调试刚安装好的Linux系统。<br/>如何成为一个称职的小型 DNS 管理者.<br/>防火墙和代理伺服. <br/>如何安装GNUC编译和程式库的方法<br/>如何在Linux系统上安装与使用第二版 GNU C Library<br/>详列了大部份被 Linux 所支援的硬件和驱动程序<br/>Linux系统上的各种业余无线电软件。<br/>包含了 Linux HOWTOs 与 mini-HOWTOs 的索引.<br/>Linux 作业系统的基本资讯<br/>从Unix、Netware、NT 以及 Windows 连接在一起。<br/>拨接 modem 连接到 ISP 网路服务接供业者的网路上。<br/>以及如何用 Java 来写 CGI 程式<br/>如何配置、编译、升级核心以及排难解纷的详细指引?/TD> <br/>一些有关使用Emacs 与 Ispell 工具的提示.<br/>一份有用资讯来源的列表<br/>针对 Linux 作业系统的网路能力提出一个概观的说明<br/>如何设定、维护在 Linux 系统下的 USENET News 伺服<br/>如何安装及设定 Oracle 资料库伺服之指南?/TD> <br/>安装及使用 PCMCIA 卡服务程式<br/>帮助你理解和使用 PnP 设备.<br/>如何把你的 Linux PC 连接到一台 PPP 伺服上. <br/>如何使用 Red Hat 包装管理程式<br/>如何产生, 预览,打印及传真任何文件<br/>如何在 Linux 机上设定串列通讯设备<br/>一种以 SGML 为基础,让你产生不同输出格式的工具.<br/>Session Message Block (SMB) protocol <br/>在Linux下的关於音效的支援. <br/>Linux上播放各式声音格式的应用程式.<br/>如何将 Linux 系统连接到不断电系统<br/>将现有产品改进并加入新价值的服务公司名单 <br/>Linux 上的 X Window System (X11R6), XFree86 3.3 版.<br/>。。。。。。。 <br/><br/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值