【Android】水波纹的使用
全文转载自:https://www.jianshu.com/p/13eb4574e988
前言
水波纹效果从Android5.0就已经出来了,基本的使用相信大家都知道了,这里多谈一些相对深层次的使用:
1、基本使用
2、水波纹效果与布局绘制之间的问题
3、长按水波纹扩散效果
4、Button点击的水波纹效果
基本使用
系统自带水波纹实现方式
有界水波纹
1android:background="?android:attr/selectableItemBackground"
无界水波纹
以控件宽高中最大的数值作为水波纹效果所在正方形的边界进行绘制
1android:background="?android:attr/selectableItemBackgroundBorderless"
自定义水波纹实现方式
1234567891011121314151617181920212223242526272829303132333435无界水波纹<?xml version="1.0" encoding="utf-8&qu ...
【Android逆向】Android逆向之使用AndroidStudio4.0动态调试Smali
前言
本来我也不想写这篇文章的,但我百度了各种坑后来得靠自己经验才得以解决。动态调试成功那一瞬间是真的很舒服才发现原来那么简单的事情被他们写的转载的那么复杂。所以今天我不得不写一个博客来描述此次动态调试的所有过程和方法以及遇到的坑。
工具准备
Apktool
AndroidStudio
DDMS
模拟器/手机
ADB
SmaliIdea.jar插件
工具下载
反编译APK
把APK反编译成Smali我这里有两种方法
第一种:用Apktool直接反编译
第二种:用dex2jar后再baksmali
这里因为多dex的原因我就用第一种,以抖音为例子
更改APK调试模式
反编译了Smali后还没完还得把APK更改为调试模式
这里我模拟器用的MT管理器更改的你们也可以用其他可以编辑编译后xml的软件更改。打开AndroidManiFest.xml文件在Application标签中任意添加一个属性
android:debuggable="true"
然后保存重新签名安装,或者如果手机破解了签名验证的可以直接安装
以调试的方式打开APK
这里我以夜神模拟器为例子
12 ...
c++常对象和常函数
对象和函数都带const修饰符即是常对象与常函数
定义常对象
const Class class;
定义常函数
void fun() const{
}
使用了常对象后对象里的任何值都不可以改变
常对象只能调用常成员函数,不能调用普通成员函数 (除了隐式调用析构函数和构造函数),常成员函数是常对象的唯一对外接口;
现在编译系统只检查函数的声明,只要发现调用了常对象的成员函数,而且该函数未被声明为const,编译阶段就报错;
常对象在被定义时需要被初始化;
C++中的cin
c++中cin的作用是获用户键盘输入的字符
用法如下
using namespace std;
char[] ch;
cin >> ch;
cout << ch;
首先是使用std命名空间然后创建一个char类型数组把输入的字符存入到数组里然后输出
cin还提供了两个get方法
第一个是cin.get()
第二个是cin.get(char)
这两个方法有啥区别呢?
第一个方法是获取一行的字符
另一个作用:可以让窗口一直保持不关闭
用法如下
using namespace std;
char[] ch;
ch = cin.get();
cout << ch;
一样使用std命名空间因为cin是在std命名空间的
使用cin或者cout都得导入iostream头文件
否则将会报错因为要用到流操作所以必须导入
另外还有一个cin.getline(chars,int)方法
这个函数看函数名就知道大概的意思了就是获取一行的字符存入chars数组中至于int呢就是他要写入的长度
比如我输入了一行文字长度总长度为10
然后我调用方法
cin.getline(cha ...
C++数据类型的转换
数据类型转换的作用就是把不同的类型转换成相同的类型如把int转string或者string转int或者任意类型之间的相互转换
这里数据类型的转换分为几种
第一种初始化转换:就是初始化的时候就设置好他的值
如int a=123;char b=a;
第二种以{ }进行转换:初始化进行转换——列表初始化
int a=123; char b = {a};
第三种表达式中的转换:进行变量之间的运算进行转换
short a=1;
int b=a+2;
第四种传递参数时的转换:由c++函数原型控制
第五种强制类型转换:
int a=10;
把int转成short
short b=(short)a;
short c=short(a);
将short 转换成long
static_cast ©;
C++类
我先讲一下new吧
我们的类其实说白了就是结构体的变种
结构体其实就是一种数据类型
我们的每一种数据都是需要内存分配的所以说类也是一种数据类型
嗯嗯
比如说有个class a;
class a{};
我们要引用这个类
我们一般定义数据是怎么定义
int num;
那么类其实也一样
类本身就是一种数据类型
所以我们可以用 类名+变量名的形式去声明
class a{};
a bianliang;
new其实就是一种申请内存的方式
他会开辟一个新的内存空间
然后返回开辟的这个地址
我们就可以把东西放进去了
这时候我们的new会根据我们声明的类型开辟 类型大小的内存返回地址 然后在这个地址把类a放进去 最后赋值到bianliang上
class a{};
a bianliang;
bianliang= new a();
那么实际上我们这里的bianliang就是一个地址
我们在结构体里我们指向地址是什么操作
->对吧a->name
函数是有类型的
执行函数的时候就要申请内存了
void占用4字节
void是空类型 不能返回的,能返回是因为这时候虽然为空类型 实际上分配了4个字节的大 ...
结构体与类的由来与指针及发展史
但是往往很多情况下我们需要几种类型配套使用,就比如说你用变量描述一个人,这个人不止有int属性
如身高,体重为浮点型,名字为字符串,年龄为int
这时候我们就需要定一个一个新类型
结构体实际上和数组也差不多
只不过是不同类型
比如说一个结构体中有两个int一个char类型
那么他就会申请9个内存单元
因为int_2+char_1=4*2+1=9
分给两个int和chart
所以结构体的本身就是个地址
ide会根据你定义的结构体让你能指向他其中的元素
结构体a里面有name和age还有height三个元素,我们表层访问是不是(*a).name
a是个地址,我们只需要指向其中的地址就可以,比如a->name
我们一般存东西都是往内存里存,所以a->name=""这种是成立的
如果有一百个人的信息怎么解决
用结构数组,然后很多时候我们需要用到一些特殊的变量——指针变量
指针变量是用于存地址用的变量
通常是变量类型后+*号声明
比如int * ;就是寸int类型变量的地址用的
既然指针是变量,那么肯定也有指针变量的地址
比如int **a;
int_*就是用来存 ...
C++数组和指针
int a[10];
那么这个时候a就是这个数组首元素的地址
*+地址是取量,取地址中的量
&+变量 是取变量地址
然后定义变量的时候 int *a;这个时候a就是指针变量
指针变量只能用来存地址
指针变量本身也是有地址的
数组名本身就是数组首元素的地址
*(arp[2])获取数组第三个元素的数组值
指针数组只能存指针,就像是char不能存int一样
int a[10];表明了长度为10的int数组
数组的特点是可以把类型一样的数据放在一起不用频繁创建变量就比如一百个一样的变量只需要循环创建存入数组里而不用一个个复制粘贴修改大大减少了时间
数组的作用其实就是为了简化大量声明!
那数组的实质就是申请一个很大的内存,然后分给每一个元素
数组有这样一个特点
int a ,b;如果说a的地址是0000,b的地址是0004,这时候我们再声明一个int c;他的地址一定是0008吗,不一定的
内存又不是你一个应用在申请,你怎么知道别的应用没申请走
可能0008就被别人拿走了,c就是0012
但是数组是一下子把0-400全部拿下来了
然后一个int是四个字节,刚好就分配给100个元素
所以 ...
【C++】学习笔记——日期和时间
C++ 标准库没有提供所谓的日期类型。C++ 继承了 C 语言用于日期和时间操作的结构和函数。为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 头文件。
有四个与时间相关的类型:clock_t、time_t、size_t 和 tm。类型 clock_t、size_t 和 time_t 能够把系统时间和日期表示为某种整数。
结构类型 tm 把日期和时间以 C 结构的形式保存,tm 结构的定义如下:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071struct tm { int tm_sec; // 秒,正常范围从 0 到 59,但允许至 61 int tm_min; // 分,范围从 0 到 59 int tm_hour; // 小时,范围从 0 到 23 int tm_mday; // 一月中的第几天,范围从 1 到 31 ...
【C++】学习笔记——基本的输入输出
easyRSA
打开发现有多个N
判断是否是使用了公有的素数,尝试使用欧几里得辗转相除分解出公有的素数
确实是使用了公有的素数,直接用n整除common(共同素数)得到另一个素数。
根据公式phi = (q -1)*(p - 1),求出phi
使用gmpy2求出模逆元d
最后循环解密即可
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677# from flag import flagimport gmpy2from Crypto.Util.number import *import binascii # m = bytes_to_long(flag)e = 65537 def gcd(a, b): # 求最大公约数 if a < b: a, b = b, a while ...