ViewPager
- 标签:
<android.support.v4.view.ViewPager/> - 适配器:
PagerAdapter
@Override
public int getCount() {
return mViewList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mViewList.get(position));
return mViewList.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mViewList.get(position));
}
- 翻页动画:
ViewPager.PageTransformer ????关键在于重写transformPage()方法
public interface PageTransformer {
void transformPage(@NonNull View page, float position);
}
往左滑动时:view1,view2,view3的position都是不断变小的。 view1的position: 0 → -1 → 负无穷大 view2的position: 1 → 0 → -1 view3的position: 1 → 0
往右滑动时:view1,view2,view3的position都是不断变大的。 view1的position: -1 → 0 view2的position: -1 → 0 → 1 view3的position: 0 → 1→ 正无穷大
当position是正负无穷大时view就离开屏幕视野了。因此最核心的控制逻辑是在[-1,0]和(0,1]这两个区间,通过设置透明度,平移,旋转,缩放等动画组合可以实现各式各样的页面变化效果。
Kotlin入门
配置Kotlin
buildscript {
ext.kotlin_version = '1.5.10'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
buildscript {
ext.kotlin_version = '1.5.10'
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
基本语法
- 没有new关键字
- 没有;
- 定义变量
var v:TYPE=value - 可空:
?
数据类型
Any 指不指定类型
a.数值类型(Numbers)
Byte,Short,Int,Long,Float,Double toInt() / toFloat() / toShort() / toLong() / toByte() / toDouble() / toChar()
b.字符类型(Characters)
Char,必须用单引号’'包起来使用,不能和数字直接操作
c.字符串类型(Strings)
String,索引访问字符s[i] trimMargin() 删除字符串多余空白 可用""" """ 拼接多行字符串
字符串模板(String Templates):即在字符串内通过一些小段代码求值并把结果合并到字符串中。模板表达式以美元符 ** $ **开头。
d.布尔类型(Boolean)
true/false
e.数组类型(Arrays)
Array,创建方式:
val a = arrayof(1,2,3) val b = Array(3,{i->i*2}) ,参数1 = 数组长度,花括号内是一个初始化值的代码块,给出数组下标 & 初始化值
size() array[] 重载了get和set方法,通过下标获取/设置数据值
Array不允许将Array赋值给Array
类
- 声明:
class 类名(参数名1:参数类型,参数名2:参数类型...){} - 实例化类:
var user = User() - 主构造函数:,采用
constructor 关键字,不能包含任何代码,初始化的代码放在以init 关键字作为前缀的代码块中
class 类名 constructor(参数名:参数类型){
init {
//...
}
}
主构造函数可省略constructor 关键字
- 次构造函数:次构造函数必须调用主构造函数,次构造函数必须加
constructor 关键字
constructor ( 构造函数参数列表 ) : this ( 主构造函数参数列表 ){
}
class User(userName: String) {
init {
println(userName)
}
constructor() : this("hjc")
constructor(age: Int) : this("hjc") {
println(age)
}
constructor(sex: String, age: Int) : this("hjc") {
println("$sex$age")
}
}
- 继承&重写
单继承。使用: 实现继承,默认不允许继承。子类默认不可重写父类方法。实现可继承、可重写使用open 关键字。子类重写的方法前添加override 关键字。
open class Food {
open fun banana() {}
}
class Fruits : Food(){
override fun banana() {
super.banana()
}
}
特殊类
内部类
关键字:inner
class User{
var age : Int = 0
inner class UserName{}
}
var username : User.UserName = User().UserName()
接口
关键字:interface 接口中的属性可以被定义,但是不能赋值,子类实现接口并重写属性
区别于Java的接口,Kotlin的接口中的方法可以有方法体。有默认方法体的接口可以不被重写。
interface UserImpl{
fun getName(): String
fun getAge(): Int{
return 21
}
}
class User :UserImpl{
override fun getName(): String {
return "xje"
}
}
同时继承类和实现接口时,类在前,接口在后,逗号隔开
数据类
关键字:data 创建类时自动创建以下4个方法。
getter/setter 方法;equals() /hashCode() 对;toString() :输出 " 类名(参数+参数值) ";copy() 函数:复制一个对象&改变它的一些属性,但其余部分保持不变
data class User()
枚举类
关键字:enum
enum class Color{
RED, GREEN, BLUE
}
变量&常量
var & val ,直接赋值可不指定类型 判断数据类型:is
函数
关键字:fun
fun 函数名(参数名:参数类型):返回值类型{
函数体
return 返回值
}
函数存在简写方式:
fun add(a: Int, b: Int): Int {
return a + b
}
fun add(a: Int, b: Int) = a + b;
控制流
if
Kotlin的if 语句本身是一个表达式,存在返回值,即可以实现var c = if (a > b) 3 else 4
when
类似Java中的switch
when (a) {
0 -> {代码块1}
1 -> {代码块2}
2,3 -> {代码块3}
else -> {代码块4}
}
for
与Java中的for类似
while
与Java中的while类似,分为while / do…while
范围使用
in →闭区间[a, b] until →左闭右开区间 [a,b) downTo →倒序判断 step →调整步长
类型检查&转换
检查:is 智能转换:因为编译器会跟踪不可变值的is检查以及显式转换,并在需要时自动插入(安全的)转换
- 反向检查:
!is - 在 && 和 || 的右侧也可以智能转换
- 在when表达式和while循环里也能智能转换
强制转换:as 可空转换操作符:as?
相等性判断
结构相等:equals() 或者== 引用相等:===
|