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

来源:互联网 发布:淘宝卖家电话在哪 编辑:程序博客网 时间:2024/05/17 22:51

android 屏幕相关知识

  • 屏幕参数
    • 屏幕大小
      屏幕大小指对角线的长度,通常用寸表示(1寸=3.3333333厘米(cm))
    • 分辨率
      分辨率指手机像素点的个数为 width * height 模式
    • PPI
      每英寸像素(Pixels per Inch,DPI),由对角线的像素点除以对角线的长度得到的
  • 系统的屏幕密度(PPI,由Google定义的标准的屏幕密度,为了减少屏幕的碎片化,也为了更好的屏幕适配)
    • 系统屏幕密度分类
      密度 ldpi mdpi hdpi xhdpi xxhdpi密度值 120 160 240 320 480分辨率 240×320 320×480 480×800 720×1280 1080×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的使用步骤
      1. 首先移动到一个位置
        path.moveTo(x,y);
      2. 开始画东西,比如画一条线
        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>

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

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

0 0
原创粉丝点击