Android中的坐标系
- 屏幕坐标系
移动设备一般定义屏幕左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向
- View的坐标系
View的坐标系统是相对于父控件而言的。
getTop(); //获取子View左上角距父View顶部的距离
getLeft(); //获取子View左上角距父View左侧的距离
getBottom(); //获取子View右下角距父View顶部的距离
getRight(); //获取子View右下角距父View左侧的距离
- MotionEvent中 get 和 getRaw 的区别
event.getX(); //触摸点相对于其所在组件坐标系的坐标
event.getY();
event.getRawX(); //触摸点相对于屏幕默认坐标系的坐标
event.getRawY();
角度与弧度
在我们自定义View,尤其是制作一些复杂炫酷的效果的时候,实际上是将一些简单的东西通过数学上精密的计算组合到一起形成的效果。这其中可能会涉及到画布的相关操作(旋转),以及一些正余弦函数的计算等,这些内容就会用到一些角度、弧度相关的知识。
- 角度:两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆周长的360分之一时,两条射线的夹角的大小为1度。
- 弧度:两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时,两条射线的夹角大小为1弧度。
圆一周对应的角度为360度(角度),对应的弧度为2π弧度。
故得等价关系:360(角度) = 2π(弧度) ==> 180(角度) = π(弧度)
//rad 是弧度, deg 是角度
rad = deg x π / 180
deg = rad x 180 / π
颜色
几种创建或使用颜色的方式
- java中定义颜色
int color = Color.GRAY; //灰色
int color = Color.argb(127, 255, 0, 0); //半透明红色
int color = 0xaaff0000; //带有透明度的红色
- 在xml文件中定义颜色
<color name="red">#ff0000</color>
<color name="green">#00ff00</color>
#f00 //低精度 - 不带透明通道红色
#af00 //低精度 - 带透明通道红色
#ff0000 //高精度 - 不带透明通道红色
#aaff0000 //高精度 - 带透明通道红色
自定义属性
Android自定义属性可分为以下几步:
- 自定义属性的声明文件
编写values/attrs.xml,在其中编写styleable和item等标签元素
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="test">
<attr name="text" format="string" />
<attr name="testAttr" format="integer" />
</declare-styleable>
</resources>
2.自定义View中获取属性
//在View的构造方法中通过TypedArray获取
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.test);
String text = ta.getString(R.styleable.test_testAttr);
int textAttr = ta.getInteger(R.styleable.test_text, -1);
3.在布局中使用
<com.example.test.MyView
android:layout_width="120dp"
android:layout_height="120dp"
app:testAttr="520"
app:text="helloworld" />
4.属性值的类型归纳
- reference资源id
//属性定义
<attr name = "background" format = "reference" />
//属性使用
<ImageView android:background = "@drawable/图片ID"/>
- color颜色值
//属性定义
<attr name = "textColor" format = "color" />
//属性使用
<TextView android:textColor = "#00FF00" />
- boolean布尔值
//属性定义
<attr name = "focusable" format = "boolean" />
//属性使用
<Button android:focusable = "true"/>
- dimension尺寸值
//属性定义
<attr name = "layout_width" format = "dimension" />
//属性使用
<Button android:layout_width = "42dp"/>
- float浮点值
//属性定义
<attr name = "fromAlpha" format = "float" />
//属性使用
<alpha android:fromAlpha = "1.0"/>
- integer整型值
//属性定义
<attr name = "framesCount" format="integer" />
//属性使用
<animated-rotate android:framesCount = "12"/>
- string字符串
//属性定义
<attr name = "text" format = "string" />
//属性使用
<TextView android:text = "我是文本"/>
- fraction百分数
//属性定义
<attr name = "pivotX" format = "fraction" />
//属性使用
<rotate android:pivotX = "200%"/>
- enum枚举
//属性定义
<attr name="orientation">
<enum name="horizontal" value="0" />
<enum name="vertical" value="1" />
</attr>
//属性使用
<LinearLayout
android:orientation = "vertical">
</LinearLayout>
- flag位或运算
//属性定义
<attr name="gravity">
<flag name="top" value="0x01" />
<flag name="bottom" value="0x02" />
<flag name="left" value="0x04" />
<flag name="right" value="0x08" />
<flag name="center_vertical" value="0x16" />
...
</attr>
//属性使用
<TextView android:gravity="bottom|left"/>
- 混合类型
//属性定义
<attr name = "background" format = "reference|color" />
//属性使用
<ImageView
android:background = "@drawable/图片ID" />
或者:
<ImageView
android:background = "#00FF00" />