手机安全卫士------手机防盗页面之完成向导页面的UI布局和动画

实现逻辑:

  • 用户点击对话框的确定按钮,跳转页面的时候判断用户此前是否设置过手机防盗功能
  • 如果设置过,直接跳转到防盗页面
  • 如果没设置过,进入设置向导页面,进行相应的配置。

设置向导页面的效果图:

功能的技术点:

1.自定义文字风格

2.自定义按钮的背景

3.界面切换的动画

4.滑动屏幕切换页面

自定义文字风格

由于布局中有很多文字的颜色、字号、上边距、左边距等属性是相同的,因此,自定义一个文字风格,降低编码工作量

具体代码如下:

 <style name="LostFindText">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textSize">24sp</item>
        <item name="android:textColor">#000</item>
        <item name="android:layout_marginTop">10dp</item>
        <item name="android:layout_marginLeft">10dp</item>
    </style>

同时被设置成自定义风格的还有每个页面左下角、右下角的按钮,在此不再赘述。

设置向导页面的布局思路:

  • 上半部分 都是一个控件占一行的格式,因此,可以采用线性布局来实现。
  • 中间的四个圆圈,用一个横向的线性布局来实现
  • 下半部分 对控件的位置布局要求较高,因此,采用相对布局

界面中还有一些小图标,比如五角星、实心圆圈、空心圆圈等,这些都是android自身的图标。 使用安卓自带的图标可以减少软件的体积。

图片和文字横向排列的时候,不需要单独写线性布局,只需要给TextView设置drawableLeft(drawableRight)属性即可

自定义按钮的背景

通过自定义按钮的背景,可以把按钮被按下、被触摸、和平时分别设置成不同的图片背景。

采用的是selector选择器。

首先,在drawable目录下创建一个xml文件,具体代码实现:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/function_greenbutton_pressed"/>
    <item android:state_pressed="false" android:drawable="@drawable/function_greenbutton_normal"/>
</selector>

分析: 根节点为selector ,设置命名空间为android本身。

设置状态背景时,每次要使用item,android:state_press=true代表按钮被按下时的状态。 android:drawable 表示在此状态下显示的图片背景

界面切换的动画

翻页动画的思路:

获取Activity在屏幕上的坐标,注意:屏幕坐标向下为Y轴正方向。

那么,点击下一步的时候,相当于当前页面左上角的点从(0,0)滑到(-100,0);下一个页面左上角的点则是从(100,0)滑到了(0,0)

点击上一步的时候,左上角的点从(0,0)滑到(100,0),上一个页面左上角的点则是从(-100,0)滑到(0,0)

具体实现代码:

点击上一步,页面进入的动画:

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:fromXDelta="-100%p"
    android:fromYDelta="0"
    android:toXDelta="0"
    android:toYDelta="0"
    >
</translate>

分析:

  • 在res目录下创建anim文件夹
  • 新建XML文件,根节点为translate
  • 内部的属性:
    • fromXDelta X轴的起点坐标
    • fromYDelta Y轴起点坐标
    • toXDelta X轴终点坐标
    • toYDelta Y轴终点坐标
    • duration 动画持续时间

在代码中使用动画:

overridePendingTransition(页面进入的动画,页面退出的动画);

注意:这条语句只能在startActivity() 或者 finish() 之后调用

用户滑动屏幕时执行翻页动画

由于滑动屏幕执行动画的功能每一个防盗向导页面都会用到,

因此,把这个功能抽取到一个父类中,让四个向导页面继承这个父类即可。

四个向导页面都用到了toPreActivity() 和 toNextActivity()的方法,只是执行的内容不同,因此,我们创建两个抽象方法到父类,强制子类实现这两个方法:

实现滑动翻页的思路:

  • 创建一个手势识别器: GestureDetector类
  • 实例化GestureDetector类

    detector = new GestureDetector(Context,SimpleOnGestureListener);

  • 实现onFling方法
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                if(e1.getRawX() - e2.getRawX() > 150)
                {
                    toNextActivity();
                    return true;
                }
                if(e2.getRawX() - e1.getRawX() > 150)
                {
                    toPreActivity();
                    return true;
                }

onFling方法中,e1代表起点,e2代表终点,通过getRawX和getRawY即可获得两点坐标。

最后,使用手势识别器:

public boolean onTouchEvent(MotionEvent event)
    {
        detector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }

搞定!!

整个基类代码如下:

package com.vincentliong.mobilesafe0722.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.Toast;

public abstract class SetupBaseActivity extends Activity
{
    //创建手势识别器
    private GestureDetector detector ;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //实例化手势识别器
        detector = new GestureDetector(SetupBaseActivity.this,new GestureDetector.SimpleOnGestureListener(){

            //手指滑动时,执行的操作
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                if(e1.getRawX() - e2.getRawX() > 150)
                {
                    toNextActivity();
                    return true;
                }
                if(e2.getRawX() - e1.getRawX() > 150)
                {
                    toPreActivity();
                    return true;
                }
                if(Math.abs(e2.getRawY()-e1.getRawY()) > 200)
                {
                    Toast.makeText(SetupBaseActivity.this,"不能这样滑动", Toast.LENGTH_SHORT).show();
                }
                return super.onFling(e1, e2, velocityX, velocityY);
            }
        });

    }

    //使用手势识别器
    public boolean onTouchEvent(MotionEvent event)
    {
        detector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }

    //创建抽象方法,强制让子类实现跳转下一页
    public abstract void toNextActivity();

    //创建抽象方法,强制让子类实现跳转上一页
    public abstract void toPreActivity();

}

版权声明:刚出锅的原创内容,希望对你有帮助~

时间: 2024-08-23 23:13:30

手机安全卫士------手机防盗页面之完成向导页面的UI布局和动画的相关文章

点击按钮(或超链接)如何跳转到另外一个页面并执行目标页面的js函数

页面跳转同时执行js代码$(function(){});url参数传递 标题的前半部分其实不必赘述,按钮也可以换成超链接.. 假设是需要在A页面上的一个按钮,点击后跳转到B页面,传一些参数后且并B页面的某个js函数可以执行~~ 关键在于如何跳转到目标页面之后并「接着」执行「目标页面的js函数」.原因是目标页面的某个js函数原来是需要点击该页面的按钮或超链接才能触发的,但现在需要在跳转到B页面后立即执行! 先不想是从A页面跳转到B页面,假设你想在B页面一打开就执行的话,是需要把代码逻辑写在$(fu

手机安全卫士------手机防盗页面之自定义对话框&amp;MD5加密

功能需求: 用户点击主页面上的"手机防盗"按钮时,判断用户是否设置过密码. 如果没有设置过,则弹出输入密码对话框 如果设置过了,则弹出设置密码对话框 用户的密码要进行MD5加密之后再存储在内存中 技术点: - 自定义对话框的使用 - MD5加密的实现方式 - SharedPreferences的读写操作 自定义对话框 1.在layout目录下创建一个布局文件,把自定义的对话框布局设置成功 具体代码实现如下 设置密码对话框的布局代码: <?xml version="1.0

手机安全卫士------手机防盗页面之发送短信&amp;接收短信

功能需求: 接上一篇文章,如果sim卡变更,则发送一条报警短信给安全号码 接收从安全号码发来的短信,如果内容为报警指令,则根据相应的报警指令做出相应的操作 发送短信 1.创建一个SmsManager对象 SmsManager manager = SmsManager.getDefault(); 2.通过SharedPreferences获取安全号码 String number 3.创建短信内容: content 4.分割短信: 由于每条短信只能70个字,所以我们要把它分割一下:manager.d

手机安全卫士------手机防盗页面之播放报警音乐&amp;GPS定位

播放报警音乐 1.把音乐文件放在res/raw文件中 2.创建MediaPlayer对象 MediaPlayer player = MediaPlayer.create(Context,R.raw.*); 3.设置声音为最高: player.setVolume(1.0f,1.0f); 4.设置声音为循环播放: player.setLooping(true); 代码: //报警音乐 MediaPlayer mediaPlayer = MediaPlayer.create(context, R.ra

手机安全卫士------手机防盗页面之销毁数据&amp;远程锁屏

销毁数据和远程锁屏的功能都要通过获得设备管理员权限才能实现 1.首先创建一个类,继承 DeviceAdminReceiver.看类名就会猜到,它可能是一个BroadCastReceiver.通过查看源代码确定这是一个广播子类.所以要到清单文件上注册. 查看Android官方API: <receiver android:name=".MyAdmin" android:label="@string/description" android:description=

手机安全卫士------手机防盗页面之sim卡绑定&amp;读取联系人

实现的功能: sim卡的绑定 读取联系人 技术点: sim卡绑定 获取开机广播 读取联系人 SimpleAdapter的使用 Activity间数据传递 sim卡绑定 思路: 创建一个TelephonyManager对象 TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 调用getSimSerialNumber()即可得到sim卡的序列号 Strin

Android实例-手机安全卫士(六)-制作功能区(设置中心)UI界面

一.目标. 制作类似手机设置中的效果.如图 二.代码实现. 1.整体采用线性布局,最上面是一个TextView,下面一个采用相对布局,并设置该相对布局的与边缘的偏移量. 2.在相对布局中存在4个组件:2个TextView.1个CheckBox和1条直线. 3.直线的画法:采用<View.../>控件,设置高度为“0.1dip”(该值的大小决定线的粗细),背景颜色为黑色(背景颜色就是线的颜色),其他属性如宽度等跟其他空间一样正常设置. 代码如下: 1 <?xml version="

Android实例-手机安全卫士(十八)-完成设置向导的4个UI和跳转事件

一.目标. 制作向导设置里面每一步的UI布局及点击事件控制. 1.使用自定义button背景.自定义组合控件.自定义文本样式等. 2.利用SharedPreferences对象,设置应用程序配置信息(向导设置完成后就不再进入)           二.代码实现. 1.在程序包下新建另外3个UI的类(分别为SetupWizard_ui_2.java.SetupWizard_ui_3.java.SetupWizard_ui_4.java),并在配置文件中注册Activity. 2.根据UI设计,在设

手机安全卫士------自动更新的设置

由于手机安全卫士每次打开都要进行检查软件版本的工作,久而久之会浪费用户的流量.因此,我们要在设置页面中,由用户自己确认是否需要开启检查更新的操作. 效果图: 技术点: 1.自定义组合控件 2.SharedPreferences的读写操作 自定义组合控件 和之前自定义风格的原因一样,都是为了减少工作量.由于该组合控件会有很多地方要用到,因此,我们把它抽取出来,封装在一个类中,需要使用的时候直接调用即可.一劳永逸! 思路: 创建一个布局文件,包括两个TextView,一个CheckBox如效果图的形