您的位置:首页 > 移动开发 > Android开发

Android 绘图机制与处理技巧-1

2017-04-05 20:59 204 查看

android 屏幕相关知识

屏幕参数

屏幕大小

屏幕大小指对角线的长度,通常用寸表示(1寸=3.3333333厘米(cm))

分辨率

分辨率指手机像素点的个数为 width * height 模式

PPI

每英寸像素(Pixels per Inch,DPI),由对角线的像素点除以对角线的长度得到的

系统的屏幕密度(PPI,由Google定义的标准的屏幕密度,为了减少屏幕的碎片化,也为了更好的屏幕适配)

系统屏幕密度分类

密度ldpimdpihdpixhdpixxhdpi
密度值120160240320480
分辨率240×320320×480480×800720×12801080×1920
独立像素密度

独立像素密度是相对于物理像素密度提出的,是为了解决在不同的设备上的物理屏幕密度大小不一样的问题

Android 以160(mdpi)的屏幕密度大小为标准,规定1px=1dp(dip),其他的物理密度可以通过这个密度进行转化为独立像素密度

转化的比例为 l:m:h:xh:xxh = 3:4:6:8:12 其中m为基准

用于代码的转换公式 dp * scale = px,只要找到scale就可以进行转换了,

float scale = getApplicationContext().getResources().getDisplayMetrics().density;


平面绘图基本知识

平面绘图一共需要两个类加上一个形状,这两个类是指Canvas和Paint类,而这个形状是指由canvas内决定的画什么形状,内容由多种形式提供,XML、Java代码等

基本的Canvas和Paint的使用粗略的说一下,因为这个API真的非常好理解canvas.drawRect();一看就是画矩形的。你可以想象一下真实世界里面的画布和画笔就可以得知功能了,画布决定了哪些内容会呈现,而画笔则决定了画的颜色啊,形状啊,等等。这里说一下Path的使用

Path的使用步骤

首先移动到一个位置

path.moveTo(x,y);

开始画东西,比如画一条线

path.lineTo(a,b) 上面的这两行代码的含义是从(x,y)到(a,b)画一条线

3.在调好画笔的颜色宽度等的情况下使用canvas,drawPath()将这条路径画上去

XML 绘图

通过XML文件对图像的引用、描绘等也是可以画图的,比如常用的src=”@drawable/ic_launcher”这就是最常见的使用XML绘图的例子,所有绘制的图形的XML文件和图片文件都应该放在res/drawable下

shape绘图基本知识,下面由代码来展示,忽略掉了具体的配置情况

<?xml version="1.0" encoding="utf-8"?>
<!--默认是rectangle-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="通过这个属性来设置具体的形状">
<corners/>      <!--这个属性在shape为矩形的时候调用-->
<gradient/>     <!--渐变,主要用来调整颜色,-->
<solid/>        <!--直接为shape填充颜色-->
<padding/>      <!--调整shape与边框之间的间距,这个属性要配合layer-list来使用,否则是没效果的-->
<size/>         <!--设置宽度-->
<stroke/>       <!--指定边框的相关属性-->
</shape>


在绘制Android群英传中的一个Shape的时候差点崩掉,就是Layer上面的那个图,怎么设置的padding没有效果呢?想来想去没结果,最后看到这是个层叠的形状,那么试试layer-list吧,结果还真是,用书上的那段代码真的是弄不出来,下面贴出我的这段代码

<?xml version="1.0" encoding="utf-8"?>
<layer-list>
<item>
<!--前面的绘制的边界是下一个绘制的新边界,例如我第一个设置了padding,那么新的边界=原边界-padding的值-->
<shape android:shape="rectangle"
xmlns:android="http://schemas.android.com/apk/res/android">
<gradient android:startColor="#171717"
android:endColor="#000000"
android:angle="45"/>
<padding
android:top="0dp"
android:left="0dp"
android:right="7dp"
android:bottom="7dp"/>
<corners android:radius="8dp"/>
</shape>
</item>
<item>

<shape android:shape="rectangle"
xmlns:android="http://schemas.android.com/apk/res/android">
<gradient android:startColor="#981573"
android:endColor="#80bf176b"
android:angle="45"/>
<corners android:radius="8dp"/>
</shape>
</item>
</layer-list>


并且发现了一个现象,就是你在上一层设置了padding,但是padding值并不在这个图层显示出来这个值的效果,并不是失效了,这个padding其实是为下一个图层做的准备,因为下个图层就会绘制到这个设置了padding的图层上,padding值的效果就会显现出来

* Selector 选择器的使用,一般使用在存在切换效果的控件中。例如给Button设置点击和未点击时候的背景的时候就可以使用这个Selector来做,未选中是一个效果,选中就又是一个效果,下面给出一个常用的例子

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_pressed="true"
android:drawable="@drawable/shape_introduce"/> <!--这些i颜色是可以替换成shape的或者layer-list的,只要是能显示出来的基本上都能替换-->
<item android:drawable="@color/colorPrimary"/>
</selector>


别小看这个例子,当时可是弄了我很长一段时间
a505
的,你不信试试将这两个item颠倒一下,你会发现颠倒了以后就没效果了,我也不知道怎么回事,到最后只能强制记住了,先写pressed的,再写正常状态下的

好了今天的任务结束了,还要回去背单词~~~~啊

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android