这几天学习了第二天的内容,

项目源代码:http://download.csdn.net/detail/itjavawfc/8241695

主要收获了:

1)自定义属性:一般用在组合控件中

2)自定义对话框:弹出的对话框中实现输入框和按钮或其它任何你想放入的组件

3)MD5加密

4)自定义按钮背景、按钮形状、自定义动画

5)实现屏幕左右滑动效果:运用传感器

部分效果视图UI如下

要点如下:

01_定义自定义控件的属性_40

1、演示当前扩展的麻烦性,再增加自定义组合控件的使用情境;

2、去掉setting_item_view.xml的文字,运行演示;

3、在SettingItemView里加自定义组合控件的标题方法setTitle();

4、在SettingActivity代码里写另外一个设置条的标题和描述信息赋值;

5、参照系统控件TextView讲解系控件的属性特点;

6、自定义标题属性title、描述打开属性descon、描述关闭属性descoff;

7、参照系统的命名空间写自定义的命名空间,并演示删除系统命名空间报错;

8、讲解自定命名空间;

9、演示运行时报错;

10、找到目录platforms\android-16\data\res\values\attrs.xml,参照TextView讲解;

11、在工程里res/values目录下创建attrs.xm文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="SettingItemView"><attr name="title" format="string" /><attr name="desc_on" format="string" /><attr name="desc_off" format="string" /></declare-styleable>
</resources>

12、属性使用,讲解两个参数的构造方法:

在布局文件里面所定义的所有属性,都会被封装到AttributeSet 的属性集合里面;

13、得到属性值(attrs.getAttributeValue(0))并打印出来;

14、使用更方便的方法:

attrs.getAttributeValue("http://schemas.android.com/apk/res/com.itheima.mobilesafe", "title");

13、把得到的值关联到各个控件里去;

14、删除SettingActivity用代码设置的描述信息和标题信息;

15、在布局文件里多次使用自定义控件,并演示;

02_总结自定义组合控件的过程_10

1、声明一个View对象 继承相对布局,或者线性布局 或者其他的ViewGroup。

2、在自定义的View对象里面重写它的构造方法。在构造方法里面就把布局都初始化完毕。

3、根据业务需求 添加一些api方法,扩展自定义的组合控件;

4、希望在布局文件里面 可以自定义一些属性。

5、声明自定义属性的命名空间。

          xmlns:itheima="http://schemas.android.com/apk/res/com.itheima.mobilesafe"6、在res目录下的values目录下创建attrs.xml的文件 声明你写的属性。<declare-styleable name="SettingItemView"><attr name="title" format="string" /><attr name="desc_on" format="string" /><attr name="desc_off" format="string" />
</declare-styleable>

7、在布局文件中写哪些你自定义的属性。

8、使用这些定义的属性。自定义View对象的构造方法里面 有一个带两个参数的构造方法

布局文件里面定义的属性都放在 AttributeSet attrs

获取那些定义的属性。

03_自定义对话框_40

1、画图两个对话框的样子;

2、写大体逻辑代码;

showLostFindDialog();//进入手机防盗的对话框;

isSetupPwd();//判断是否设置过密码,用到共享偏好。private boolean isSetupPW(){String password = sp.getString("password", null);return !TextUtils.isEmpty(password);}showSetupPwdDialog();showEnterDialog();布局文件(dialog_setup.password.xml):<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="300dip"android:layout_height="wrap_content"android:orientation="vertical" ><TextViewandroid:layout_width="300dip"android:layout_height="40dip"android:background="#66ff6600"android:gravity="center"android:text="设置密码"android:textColor="#000000"android:textSize="20sp" /><EditTextandroid:id="@+id/et_setup_pwd"android:layout_width="280dip"android:layout_height="wrap_content"android:hint="请输入密码" /><EditTextandroid:id="@+id/et_setup_pwd_confirm"android:layout_width="280dip"android:layout_height="wrap_content"android:hint="请再输入密码" /><LinearLayoutandroid:layout_width="280dip"android:layout_height="wrap_content"android:gravity="center"android:orientation="horizontal" ><Buttonandroid:id="@+id/ok"android:layout_width="140dip"android:layout_height="wrap_content"android:text="确定" ></Button><Buttonandroid:id="@+id/cancel"android:layout_width="140dip"android:layout_height="wrap_content"android:text="取消" ></Button></LinearLayout></LinearLayout>

showSetupPwdDialog();对话框的代码:

确定按钮:

String password= et_setup_pwd.getText().toString().trim();
String password_confirm = et_setup_pwd_confirm.getText().toString().trim();
if(TextUtils.isEmpty(password)||TextUtils.isEmpty(password_confirm)){
Toast.makeText(getApplicationContext(), "密码为空", 0).show();
return ;
}
if(password.equals(password_confirm)){
//密码相同-保存并且进入手机防盗页面
Editor editor = sp.edit();
editor.putString("password", password);
editor.commit();
dialog.dismiss();
//进入手机防盗页面
Log.i(TAG, "密码已经保存,进入手机防盗页面");
}else{
Toast.makeText(getApplicationContext(), "密码不一致", 0).show();
return ;
}

取消按钮

前提

dialog = builder.show();
dialog.dismiss();

3、设置密码对话框部署并找出不好看的原因,并且修改;

修改大小小于父控件;

4、设置密码对话框变得好看。加ID,并实现点击代码逻辑;

初始化ID、

取消事件--dialog抽取出去:

确定事件:

5、拷贝进入密码对话框布局文件,并命名为:dialog_enter_password.xml

6、拷贝进入密码对话框的代码并修改

7、总结:不同的布局文件里面各自的ID是可以重名的

但是同一个布局文件里,相同的ID不允许重名的;

04_自定义对话框的细节_10

本知识点需要:手机能共享网络

1、创建2.3模拟器展示对话框(有黑背景),4.12和2.3的区别,并说明原因

2、解决在2.3对话框有黑背景的问题

设置背景为白:android:background="#ffffff"alertDialog = builder.create();alertDialog.setView(view, 0, 0, 0, 0);alertDialog.show();

05_密码的MD5加密_24

1、为什么要加密--不加密的不安全

知识拓展:

root权限

买过来的手机是没有root权限的;

Root权限是linux系统的超级管理员权限;

如果你的手机刷机了,那就有root权限

模拟器能看到data/data里的数据,是为了方便开发者

没有root权限的手机是看不到data/data

有root权限的符号:#

没有root权限的符号:$

查看config.xml命令

cat config.xml

2、md5算法

不可逆的:原文--》密文、用系统的API可以实现;

123456 ---密文

1987 ----密文;

算法步骤:

1、用每个byte去和11111111做与运算并且得到的是int类型的值:

byte & 11111111;

2、把int 类型转成 16进制并返回String类型;

3、不满八个二进制位就补全;

public static void main(String[] args) throws NoSuchAlgorithmException {MessageDigest digest = MessageDigest.getInstance("md5");String password = "123456";byte [] result = digest.digest(password.getBytes());StringBuffer buffer  = new StringBuffer();for(byte b : result){//0xff是十六进制,十进制为255int nuber =  b & 0xff;String str = Integer.toHexString(nuber);if(str.length()==1){buffer.append("0");}buffer.append(str);}//这就是MD5加密得到的值System.out.println(buffer);}

没有事先准备的算法异常;

4、网站验证算法是否正确(www.cmd5.com)、加密再加密再演示

5、密码加盐

6、合并代码进入工程(MD5Utils)

7、删除config.xml (rm *),并演示;

06_手机防盗设置向导的第一个界面_40

准备:需要谷歌文档

1、演示百度输入法设置向导

2、创建LostFindActivity,在HomeActivity激活并可以进入;

判断是否用户设置向导,如果没有就进入设置向导;

3、创建Setup1Activity

4、自定义标题样式命名:text_title_style

5、自定义文本样式text_content_style(图片名star_big_on)。

6、小点图片(presence_online、presence_invisible)

07_自定义按钮状态背景_15

1、在android-16\data\res\values\styles.xml看一下系统定义的Button样式,看一下低版本和版本的区别

2、看一下帮助文档(Develog/App Resources/Resource Types)Button如何自定义;

创建drawble目录 ,拷贝文档中定义的案例;

3、用美图秀秀自定义按钮背景(50*50),命名:button.xml

4、用别人的图片:button_bg.xml,用自己准备好的图片;

5、把做好的背景设置到设置密码对话框和输入密码对话框;

6、进模拟器设置里设置显示边框。

08_4个设置向导的UI完成和跳转事件_43

1、讲出几个布局文件的共性;

2、拷贝老版本布局文件的代码或者敲一遍布局文件代码;

3、自定义下一个、上一个按钮样式;

4、如果是拷贝的话把布局文件报错的地方解决完成;

5、创建多个Setup2Acitvity、Setup3Acitvity、Setup4Acitvity;并在功能清单注册;

6、定义点击事件在样式里:

7、代码里实现;

8、从手机防盗页面到第一个设置页面Intent;

9、拷贝手机防盗页面,并完成跳转;

09_手机防盗页面的完成_15

10_shape形状资源_13

1、前提:重新进入设置向导控件没点击效果

2、看文档Develop/API Guides/App Resources/Drawable/Shape Drawable

单词:corners : 角  ;  gradient :梯度; solid:固定的; stroke: 边框--可以做下划线

Rectangle : 矩形;dash :破折号 gap:间隙;

3、拷贝实例代码,文件命名(gradient_box.xml)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><corners android:radius="5dip"/><gradient android:startColor="#ff0000"android:endColor="#00ff0000"/><solid android:color="#ffffff" /><stroke android:width="3dip" android:color="#000000" android:dashGap="5dip"android:dashWidth="5dip"/></shape>

4、默认状态gradient_box.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><corners android:radius="5dip"/><solid android:color="#ffffff" /></shape>

5、按下去状态状态gradient_box_press.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><corners android:radius="5dip"/><solid android:color="#22000000" /></shape>

6、把两个状态整合在shape_bg.xml

7、并使用

11_设置向导页面的切换动画_12

1、anim

2、下一步动画 位移动画

解释-100%p p:代表父窗体,100%:代表整个窗体,-:代码向左移动;

tran_out.xml

<?xml version="1.0" encoding="utf-8"?>
<translate  xmlns:android="http://schemas.android.com/apk/res/android"android:fromXDelta="0"android:toXDelta="-100%p"android:fromYDelta="0"android:toYDelta="0"android:duration="500"></translate>Tran_in.xml
<?xml version="1.0" encoding="utf-8"?>
<translate  xmlns:android="http://schemas.android.com/apk/res/android"android:fromXDelta="100%p"android:toXDelta="0"android:fromYDelta="0"android:toYDelta="0"android:duration="500"></translate>

3、使用动画:

overridePendingTransition(R.anim.tran_in, R.anim.tran_out);上一步动画
Tran_pre_out.xm;<?xml version="1.0" encoding="utf-8"?>
<translate  xmlns:android="http://schemas.android.com/apk/res/android"android:fromXDelta="0"android:toXDelta="100%p"android:fromYDelta="0"android:toYDelta="0"android:duration="500"></translate>Tran_pre_in.xm<?xml version="1.0" encoding="utf-8"?>
<translate  xmlns:android="http://schemas.android.com/apk/res/android"android:fromXDelta="-100%p"android:toXDelta="0"android:fromYDelta="0"android:toYDelta="0"android:duration="500"></translate>4、使用动画:
overridePendingTransition(R.anim.tran_pre_in, R.anim.tran_pre_out);

知识拓展:

有些手机上无法出现动画:是因为把播放动画的功能关闭了,为什么关闭呢,是为什么省点;

Android手机省电的几个技巧:

1.不要用动态的壁纸;

2.屏幕亮度调低一些;

3.3G网络关闭使用,2G网络,当然是不需要上网的情况下;

4.关闭手机执行动画;

5.经常杀一下后台的应用;

12_屏幕的滑动切换&s抽取父类_39

1、在Setup1Activity定义一个手势识别器;GestureDetector

3、抽取next()--->shownext();代码
public class Setup1Activity extends Activity {//1、声明一个手势识别器private GestureDetector gestureDetector;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_setup1);//2、初始化一个手势识别器gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener(){//当时手指在屏幕上滑动时调用的方法@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2,float velocityX, float velocityY) {if((e2.getRawX() - e1.getRawX()) > 200){//显示上一个页面:从左向右滑动System.out.println("显示上一个页面");return true;}if((e1.getRawX() - e2.getRawX()) > 200){//显示下一个页面:从右向左滑动shownext();System.out.println("显示下一个页面");return true;}return super.onFling(e1, e2, velocityX, velocityY);}});}//3、用手势识别器,检查屏幕上的手势识别器@Overridepublic boolean onTouchEvent(MotionEvent event) {gestureDetector.onTouchEvent(event);return super.onTouchEvent(event);}public void next(View view){shownext();}private void shownext() {Intent  intent = new Intent(this,Setup2Activity.class);startActivity(intent);finish();//关闭当前的页面overridePendingTransition(R.anim.tran_in, R.anim.tran_out);}}

1、使用注册

2、抽取到基类BaseSetupActivity

3、屏幕竖值方向的滑动;

if(Math.abs((e2.getRawY() - e1.getRawY())) >100){Toast.makeText(getBaseContext(), "不能这样滑动", 0).show();return true;}
7、屏蔽滑动慢if(Math.abs(velocityX)< 200){Toast.makeText(getBaseContext(), "滑动有些慢哥们", 0).show();return true;}

黑马程序员Android学习笔记——金山卫士项目——第二天相关推荐

  1. 黑马程序员Android学习笔记——金山卫士项目——第三天

    学习了,一定要总结,学习贵在永恒贵在用心. 学习内容: 1.绑定sim卡 2.检查手机是否更换sim卡 3.读取手机联系人 4.手机防盗原理 5.短信指令的广播 6.播放报警音乐 7.三种获取手机位置 ...

  2. 黑马程序员Android学习笔记——金山卫士项目——第四天

    主要学习内容: 1)号码归属地查询UI设计 2)号码归属地查询的原理 3)号码归属地查询的代码实现 5)输入框抖动和震动效果 6)来电.去电号码归属地的显示 7)代码注册广播接受者的实现 8)自定义吐 ...

  3. 黑马程序员Maven学习笔记

    前言 这里是黑马程序员Maven学习笔记分享,这是视频链接. 我还有其它前端内容的笔记,有需要可以查看. 文章目录 前言 基础 Maven简介 Maven是什么 Maven的作用 Maven的下载 M ...

  4. 黑马程序员C++学习笔记(第三阶段核心:STL)--- 更新中

    目录 迭代器 序列式容器 vector -- 可随机访问 list -- 不支持随机访问 deque -- 动态 关联式容器 -- 红黑树 map multimap set multiset -- 废 ...

  5. 黑马程序员Javaweb学习笔记01

    该博客主要记录在学习黑马程序员Javaweb过程的一些笔记,方便复习以及加强记忆 文章目录 一 . BS架构,HTTP协议 http请求数据格式和相应数据格式 二 . web服务器 2.1 tomca ...

  6. 黑马程序员Javaweb学习笔记02【request和response】

    该博客主要记录在学习黑马程序员Javaweb过程的一些笔记,方便复习以及加强记忆

  7. 黑马程序员C++学习笔记<第一阶段_基础篇>

    配套视频网址: 黑马程序员:http://yun.itheima.com/course/520.html?bili B站:https://www.bilibili.com/video/BV1et411 ...

  8. 黑马程序员SSM-MyBatisPlus学习笔记

    目录 一.MyBatisPlus简介 1.1 SpringBoot整合MyBatisPlus入门程序 1.2 MyBatisPlus概述 二.标准数据层开发 2.1 标准数据层CRUD功能 2.2 分 ...

  9. 黑马程序员-C#学习笔记(二)

    ---------------------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ---------------------- - C# 学习笔记 一.变量与表达 ...

最新文章

  1. 计算机专业术语graphui,计算机专业术语英译
  2. Windows最经典应用大变脸:学生爽翻!
  3. 全能Android HOOK框架 JNI NATIVE JAVA ART DALVIK
  4. spring导入约束
  5. 15-Flutter移动电商实战-商品推荐区域制作
  6. 【研究】Joomla二阶注入
  7. SpringCloud工作笔记034---Zuul配置项中sensitiveHeaders和ignoredHeaders的不同
  8. [转]cscope在windows下使用mingw编译的方法
  9. validate使用
  10. [ P1 ] 雷达相机标定基本知识
  11. P0 口输出级具有能带 8个 LSTTL 门负载能力(指每个端口线例如P0.0P0.1每条位线,而不是整个P0口反证P2地址高8位,如果只能带4个怎么用)这个是门电路的扇出系数也就扇出带门负载能力
  12. Ubuntu20.04英文系统无法安装中文智能拼音输入法
  13. 【大数据实战】苏宁大数据离线任务开发调度平台实践:设计与开发过程中的要点
  14. php订阅号网页登录,微信订阅号怎么使用网页授权登录
  15. 汽车动力性仿真matlab程序,汽车理论课程设计:基于Matlab的汽车动力性的仿真
  16. LiveGBS国标视频流媒体平台GB/T28181针对没有位置上报的设备如何自定义位置经度纬度信息电子地图标注
  17. matlab卷积矩阵绝对值,MATLAB矩阵分析和计算
  18. android平板苹果,苹果界面让人生厌 5款Android平板推荐
  19. Hadoop大数据平台实践(二):Hadoop生态组件的学习文档
  20. Unity SRP URP HDRP 的区别

热门文章

  1. 将英文时间转换为数字时间
  2. STUN和TURN技术
  3. Arduino UNO + DS1302利用31字节静态RAM存储数据并串口打印
  4. Java 实现四则运算 附实现代码
  5. SurfaceHolder视频播放
  6. 拟合(Fitting)
  7. sublime中php代码多行注释快捷键,sublime快捷键
  8. SouthernBiotech 艾美捷正常山羊血清说明书
  9. sql判断字段是否含有中文,orcale,mysql判断字段是否含有中文
  10. MySQL 5.7 PREPARE、EXECUTE、DEALLOCATE语句介绍