CustomView1.md

Android自定义View(一)

目录:

屏幕坐标系

手机屏幕左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向。

如下图:

1.png

view的坐标

view的坐标是相对父容器而言的,包括:getTop()、getBottom()、getLeft()、getRight()。

如下图:

2.png

从android3.0开始,View增加了几个参数:x、y、translationX和traslationY,x和y是View左上角的坐标,而translationX和traslationY是View左上角相对于父容器的偏移量。这几个参数是相对于父容器的坐标,并且translationX和traslationY的默认值是0,和View的四个基本的位置参数一样,View也提供了get和set方法。这几个参数的换算关系如下: x=left+translationX、y=top+translationY,View在平移的过程中, top和left表示原始左上角的位置信息,它们的值并不会发生改变,此时发生改变的是x、y、translationX和traslationY这四个参数。

MotionEvent和TouchSlop

MotionEvent中的getRaw和get

event.getRowX()、event.getRowY():触摸点相对于屏幕原点的x坐标

event.getX()、event.getY(): 触摸点相对于其所在组件原点的x坐标

3.png

TouchSlop

TouchSlop是系统所能识别出的被认为是滑动的最小距离,就是两次滑动之间的距离小于这个常量,系统就不认为你在进行滑动操作,这是一个常量,和设备有关。获取方法:ViewConfiguration.get(getContext()).getScaledTouchSlop()。

角度与弧度

注:默认的屏幕坐标系中角度增大方向为顺时针

角度:角度是60进制,两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆周长的360分之一时,两条射线的夹角的大小为1度。

如下图:

4.png

弧度:弧度是10进制,两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时,两条射线的夹角大小为1弧度。

如下图:

4.png

角度和弧度的换算:rad = deg x π / 180,deg = rad x 180 / π,其中rad是弧度,deg是角度。圆的周长为2πr,由上面弧度概念可知圆360度对应2π弧度。

简介颜色

屏幕上默认的模式是RGB565,而我们常用的都是ARGB8888(四通道高精度(32位))和ARGB4444(四通道低精度(16位)),还有一种不常用的Alpha8(仅有透明通道(8位))。

ARGB通道,其中RGB是红绿蓝,A是Alpha(通常用来作为此颜色的透明度),取值范围均为0~255,RGB 从0x00到0xff表示颜色从深到浅,A 从ox00到oxff表示从透明到不透明。

在Android Studio中打开一张图片,在左上角可以看到一个绿色吸管(颜色选择器)。

如下图:

image.png

点击打开,在中间的圆圈色板中选择任意颜色可得到它的RGB值,不过它还有个功能,点击下图红色圈出的绿色吸管,你就可以查看电脑当前屏幕中任意颜色的RGB值。

image.png

注:Android Studio界面不要最大化,然后把你想要查的图片或其它画面和它放在电脑的同一屏幕下。别小看这个小功能,很实用的。

如下gif图(有点模糊,将就看):

5.gif

颜色混合模式

安卓着色器(tint)可以为图标着色,既可以在xml中,也可以在代码中设置,一共有16种颜色混合模式。

如下图:

image.png

Alpha通道主要在两个图像混合的时候生效。默认情况下,当一个颜色绘制到Canvas上时的混合模式是这样计算的:(RGB通道) 最终颜色 = 绘制的颜色 + (1 - 绘制颜色的透明度) × Canvas上的原有颜色。绘制颜色和原有颜色都是经过预乘了自己的Alpha通道的值的。

PorterDuff模式的混合计算公式:(D指原本在Canvas上的内容dst,S指绘制输入的内容src,a指alpha通道,c指RGB各个通道)。

定义颜色

上面简单了解了一下颜色的相关内容,现在来介绍一下使用。

在java中定义使用:

int color= Color.BLUE;//蓝色
int color1= Color.rgb(0,0,255);//蓝色
int color2= Color.argb(127,0,0,255);//半透明度蓝色
int color3=0xff0000ff;//蓝色带透明度
int color4=getResources().getColor(R.color.blue);//引用xml中定义的颜色

在xml中定义:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--蓝色-->
    <color name="blue">#0000ff</color>
    <!--半透明度蓝色-->
    <color name="blue1">#7f0000ff</color>
</resources>

参考