zoukankan      html  css  js  c++  java
  • Android学习笔记_42_各种图形的炫酷效果的实现和使用

    一、文档位置:

      这里在android中的图形,在帮助文档的这个页面,
        android-sdk-windowsdocsguide opics esourcesdrawable-resource.html

    二、图形种类:

      2.1 Bitmap:

      2.2 Nine-Patch File
      NinePatch是一种很有用的PNG图片格式,它可以在特定区域随文字大小进行缩放。如下:从上图可以看到,背景图片的中间区域会随着文字的大小进行缩放。背景图片是一张NinePatch图片。 NinePatch图片可以使用android自带的draw9patch工具来制作,该工具在SDK安装路径的tools目录下。执行该工具,然后点击“File”->“open 9-path”打开一张用于制作NinePatch图片的原来图片。在画布的上方和左方的边上画线指定缩放区域,勾选“Show patches”可显示画定的区域,绿色为固定大小区域,红色为缩放区域,文字会摆放在红色区域。制作完后,点击“File” “save 9-path”保存图片,draw9patch工具会自动为图片加上*.9.png后缀。把制作好的图片拷贝进项目的res/drawable目录,然后
    编写代码。如下:

    <TextView android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:text="退出" android:textColor="#330000"
        android:background="@drawable/button"/>

      Nine-Patch File这种图片可以指定在特定的区域进行缩放,比如,在一个图片中有文字,文字在图片的中间位置,右边是一个代表播放的三角图形,这时候当文字变多的时候,Nine-Patch File这种图图形,就可以拉伸中间位置,这样就可以撑得下更多的文字,而原来右边的代表播放的三角图形不会拉伸变化.
      cmd进入命令界面:
         输入:G:androidandroid-sdk-windows ools>draw9patch
      回车,这个时候就会看到制作9path图片的界面:这时候:点击“File”->“open 9-path”打开一张用于制作NinePatch图片的原来图片。
      在画布的上方和左方的边上画线指定缩放区域,勾选“Show patches”可显示画定的区域,绿色为固定大小区域,红色为缩放区域,文字会摆放在红色区域。制作完后,点击“File” “save 9-path”保存图片,draw9patch工具会自动为图片加上*.9.png后缀。

    2.3 Layer List 层列表图形:

      可以使用一组图片合成一张图片,下面是文档中关于Layer List 层列表图形的介绍:
         file location: res/drawable/filename.xml,需要使用资源id,来找到这个文件.下面是源码:

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list
        xmlns:android="http://schemas.android.com/apk/res/android" >
        <item
            android:drawable="@[package:]drawable/drawable_resource"//指定某个图片
             android:id="@[+][package:]id/resource_name"   //给这个图片指定一个id  
    
            //下面这四个属性:上面,右边,底部,左边离边框的距离.
            android:top="dimension"
            android:right="dimension"
            android:bottom="dimension"
            android:left="dimension" />
    </layer-list>

      应用: 一个相框中有一个美女图片,然后当点击切换按钮后,相框中的美女图片被切换了。

    public class DrawableActivity extends Activity {
        private ImageView imageView;
        
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
           //2.找到imageView控件
            imageView = (ImageView) this.findViewById(R.id.imageView);
        }
        //1.点击按钮后会执行这个方法,切换图片
       public void changeImage(View v){ 
         //LayerDrawable layerDrawable = (LayerDrawable) imageView.getDrawable();
         //4.从imageview中取得,目前正在显示的照片,得到一个层列表图形layerDrawable
         //7.直接取得列表图形资源,然后设置,然后显示.这时候就可以了.所以这里有个特点
         //当drawable被imageview使用了,这时候要尝试修改它是没有用的,所以这里需要直接加载它,然后,再给它赋值就额可以了.
         LayerDrawable layerDrawable = (LayerDrawable)getResources().getDrawable(R.drawable.layerlist);
         Drawable drawable = getResources().getDrawable(R.drawable.icon);
         //6.首先取得资源对象.用getDrawable取得图形,得到图标这个图形,返回一个drawable图形.
         //将应用部署后,发现当点击按钮后,并不可以成功的切换图片,这里又尝试这样做.
         //5.这里第一个参数得到要切换的照片,这里指的是哪个在边框里面的图片
         //,第二个参数:是要切换的那张照片的drawable图形.(层列表图形.)
         layerDrawable.setDrawableByLayerId(R.id.userimage, drawable);
         //3.设置更换完的图形,这里要求传一个Drawable进去.
         imageView.setImageDrawable(layerDrawable);
        }
    }

    /drawable/res/drawable/icon.png
    /drawable/res/drawable/user.png
    /drawable/res/drawable/layerlist.xml

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
      <!-- 使用两张照片合成一个新的照片:faceback,和user
       -->
       <!-- 指定需要合成的单个照片 
         android:top="68dp"
            android:right="18dp"
            android:bottom="22dp"
            android:left="18dp"
            android:id="@+id/userimage"
            如果不写这几句,照片会整个的占满整个屏幕
            这个xml的内容,可以在帮助文档中,找到:
            file:///G:/android/android-sdk-windows/docs/guide/topics/resources/drawable-resource.html#LayerList
            example:XML file saved at res/drawable/layers.xml: <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item>
          <bitmap android:src="@drawable/android_red"
            android:gravity="center" />
        </item>
        <item android:top="10dp" android:left="10dp">
          <bitmap android:src="@drawable/android_green"
            android:gravity="center" />
        </item>
        <item android:top="20dp" android:left="20dp">
          <bitmap android:src="@drawable/android_blue"
            android:gravity="center" />
        </item>
    </layer-list>
        -->
        <item android:drawable="@drawable/faceback" />
        <item android:drawable="@drawable/user"
            android:top="68dp"
            android:right="18dp"
            android:bottom="22dp"
            android:left="18dp"
            android:id="@+id/userimage"
            />
             <!-- android:id="@+id/userimage"使用这个属性给图片定义一个id -->
    </layer-list>

    /drawable/res/layout/main.xml

      <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
        <!-- 这里用一个imageView控件,实现图片的存放 -->
    <ImageView  
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:src="@drawable/layerlist"
        android:id="@+id/imageView"
        />
    <!-- 点击按钮后,要求实现图片切换的功能 :-->
     <Button
       android:background="@drawable/rectangle"
      android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="切换"
        android:onClick="changeImage"
     />
    </LinearLayout>

    注意:层列表图形,就可以用来开发,给图片加相框的功能,只要是想要多张照片合成一张照片的时候,都可以用到层列表图形
    2.4 State List 状态列表图形:

       当我们点击某个按钮,或者是某个控件的时候,会切换图片,也就是随着,控件的状态来显示不同的图形.
       这里实现,当按钮显示的时候显示一张照片,当按钮被按下去的时候,显示另一张照片
       文件位置: res/drawable/filename.xml
       语法:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android"
       //这个是选择器,根据不同的状态选择下面的不同条目
        android:constantSize=["true" | "false"]
        android:dither=["true" | "false"]
        android:variablePadding=["true" | "false"] >
        <item
        //条目用于指定哪个状态,显示什么图片
            android:drawable="@[package:]drawable/drawable_resource"
            //这个属性用来显示某个图片
     android:state_pressed=["true" | "false"]]
     //true:按下这个显示控件的时候,显示这张照片
     //false:没有按下这个显示控件的时候,显示这张照片
            android:state_focused=["true" | "false"]
            //true:当这个显示控件得到焦点的时候,显示这张照片
     //false:当这个显示控件没得到焦点的时候,显示这张照片
            android:state_hovered=["true" | "false"]
     //这个没有标明,用的时候可以查查.
            android:state_selected=["true" | "false"]
     //true:当这个显示控件被选择的时候,显示这张照片
     //false:当这个显示控件不被选择的时候,显示这张照片
     //这里选择是指的用上下键,当有框,或不同颜色,指定这个控件被选择的时候
            android:state_checkable=["true" | "false"]
     //true:当这个显示控件可以被勾选的时候,显示这张照片
     //false:当这个显示控件不可以被勾选的时候,显示这张照片
            android:state_checked=["true" | "false"]
     //true:当这个显示控件被勾选的时候,显示这张照片
     //false:当这个显示控件不被勾选的时候,显示这张照片
            android:state_enabled=["true" | "false"]
     //true:当这个显示控件被可用的时候,显示这张照片
     //false:当这个显示控件不可用的时候,显示这张照片
            android:state_window_focused=["true" | "false"] />
     //true:当该控件所在窗口获得焦点的时候,显示这张照片
     //false:当该控件所在窗口没获得焦点的时候,显示这张照片
     //这些就是显示控件的不同状态.
    </selector>

    2.5 Level List 级别列表图形:
      类型图形可以用于管理一组可进行切换的图片。使用setLevel方法可以进行图片切换,Android会根据level的值自动选择对应的图片。手机显示剩余电量就是用Level List图形来显示不同图片的。
      文件位置: res/drawable/filename.xml
      语法

    <?xml version="1.0" encoding="utf-8"?>
    <level-list
        xmlns:android="http://schemas.android.com/apk/res/android" >
        <item
            //图片的位置
          android:drawable="@drawable/drawable_resource"
            //这里定义了两个范围,当
          android:maxLevel="integer"
         android:minLevel="integer" />
    </level-list>

    2.6 Transition Drawable 过程图形:

      也就是从一张图片过度到另一张图片
      文件位置: res/drawable/filename.xml

    <xml version="1.0" encoding="utf-8"?>
    <transition
    xmlns:android="http://schemas.android.com/apk/res/android" >
        <item
            android:drawable="@[package:]drawable/drawable_resource"
            android:id="@[+][package:]id/resource_name"
            android:top="dimension"
            android:right="dimension"
            android:bottom="dimension"
            android:left="dimension" />
    </transition>

    2.7 Clip Drawable 剪切图形:

          Clip Drawable类型图形(裁剪图形)
      文件位置: res/drawable/filename.xml

    <?xml version="1.0" encoding="utf-8"?>
    <clip
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/drawable_resource"
        android:clipOrientation=["horizontal" | "vertical"]
        android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                         "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                         "center" | "fill" | "clip_vertical" | "clip_horizontal"] />

    2.8 Scale Drawable 缩放图形:
    file:///G:/android/android-sdk-windows/docs/guide/topics/resources/drawable-resource.html#StateList
    2.9 Shape Drawable 形状图形:

      file location: res/drawable/filename.xml
     The filename is used as the resource ID.
     b.resource reference: In Java: R.drawable.filename
     In XML: @[package:]drawable/filename 
     android:shape=["rectangle" | "oval" | "line" | "ring"] > 矩形,椭圆形,线性,环形.

    <shape
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape=["rectangle" | "oval" | "line" | "ring"] >
        //这个用来指定形状
        <corners
        //这个指的是圆角的,圆角的大小由半径决定的.
            android:radius="integer"
     //如果一个矩形的四个角的圆角,大小都一样的话就只设置这个就行了
            android:topLeftRadius="integer"
            android:topRightRadius="integer"
            android:bottomLeftRadius="integer"
            android:bottomRightRadius="integer" 
     //如果矩形的,四个圆角的大小不一样的话,那么需要进行每个圆角的半径设置,这时候就
     //用到了下面的四个属性.
     />
        <gradient
        //这个是渐变,用来指定渐变的颜色,可以由一种颜色过渡到另一种颜色,
        //还可以在从一种颜色过渡到另一种颜色的时候,指定一个中间色.
            android:angle="integer"
     //这个是角度.渐变是有角度的,从一种颜色过渡到另一个颜色,
     //指定是水平的还是180度...还是多少度..等等.
            android:centerX="integer"//中间过渡色出现在什么地方
            android:centerY="integer"////中间过渡色出现在什么地方
            android:centerColor="integer"//指定中间过渡色是什么颜色.
     //这三个用来指定过渡色
            android:endColor="color"//过渡色的结束颜色
            android:gradientRadius="integer"//当时圆形渐变色的时候,需要指定渐变的半径
            android:startColor="color"//过渡色的开始颜色
            android:type=["linear" | "radial" | "sweep"]//指定是什么渐变色,比如,
     //线性渐变色,还是圆形渐变色...当时圆形渐变色的时候,需要指定渐变半径
            android:usesLevel=["true" | "false"] />//是否使用级别,可以设为默认值就可以
        <padding//指定内间距,假设定义了一个矩形,那么内间距,就是内容离矩形的边界线的距离.
            android:left="integer"
            android:top="integer"
            android:right="integer"
            android:bottom="integer" />
        <size//代表,线框的宽
            android:width="integer"//定义边界线的粗细.
            android:height="integer"
      android:dashWidth="integer"//当边界是虚线的时候,用来定义
            android:dashGap="integer"//定义虚线的宽度.
     />
        <solid//单一填充色,这个和渐变色是不可以同时使用的.
            android:color="color" />
        <stroke//这个和size差不多
            android:width="integer"
            android:color="color"
            android:dashWidth="integer"
            android:dashGap="integer" />
    </shape>

    三、后台代码:

      包含以上图形的后台实现。

    public class DrawableActivity extends Activity {
        private ImageView imageView;
        
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
           //2.找到imageView控件
            imageView = (ImageView) this.findViewById(R.id.imageView);
        }
        //1.点击按钮后会执行这个方法,切换图片
       public void changeImage(View v){
         //这个是用来测试,裁剪动画的.
         ClipDrawable clipDrawable = (ClipDrawable) imageView.getDrawable();
         //取得裁剪图形.
        clipDrawable.setLevel(clipDrawable.getLevel()+1000);
         //指定级别,如果级别值是0,代表全部裁剪,所以设置为0的时候,会全部裁剪,看不到
        //当为10000的时候会不裁剪.全部显示.
         
         //得到相应的,这里v是传进来的,这里需要(Button)v把传进来的v转换为button控件
        //然后调用button控件的.getBackground(),方法,(TransitionDrawable)
        //这里再把button的Background转换为过度显示图形.
        //然后设置,过度的事件为500毫秒.
        TransitionDrawable transitionDrawable = (TransitionDrawable) ((Button)v).getBackground();
         transitionDrawable.startTransition(500);
         
        
         /*下面是用来实现图片的级别列表图形的,也就是当级别12,在对应的图片设置的级别
          * 范围内的时候,就会显示对应的图片
          * LevelListDrawable levelListDrawable = (LevelListDrawable) imageView.getDrawable();
         levelListDrawable.setLevel(12);*/
         
        
         /*下面这个部分是用来测试层列表图形的
          * 
          * //LayerDrawable layerDrawable = (LayerDrawable) imageView.getDrawable();
         //4.从imageview中取得,目前正在显示的照片,得到一个层列表图形layerDrawable
         //7.直接取得列表图形资源,然后设置,然后显示.这时候就可以了.所以这里有个特点
         //当drawable被imageview使用了,这时候要尝试修改它是没有用的,所以这里需要直接加载它
         //然后,再给它赋值就额可以了.
         LayerDrawable layerDrawable = (LayerDrawable)getResources().getDrawable(R.drawable.layerlist);
         Drawable drawable = getResources().getDrawable(R.drawable.icon);
         //6.首先取得资源对象.用getDrawable取得图形,得到图标这个图形,返回一个drawable图形.
         //将应用部署后,发现当点击按钮后,并不可以成功的切换图片,这里又尝试这样做.
         //5.这里第一个参数得到要切换的照片,这里指的是哪个在边框里面的图片
         //,第二个参数:是要切换的那张照片的drawable图形.(层列表图形.)
         layerDrawable.setDrawableByLayerId(R.id.userimage, drawable);
         //3.设置更换完的图形,这里要求传一个Drawable进去.
         imageView.setImageDrawable(layerDrawable);
         */
        }
    }

    /drawable/res/drawable/bg_normal.9.png
    /drawable/res/drawable/bg_selected.9.png
    /drawable/res/drawable/clip.xml

     <?xml version="1.0" encoding="utf-8"?>
    <clip xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/user"
        android:clipOrientation="horizontal"
        android:gravity="left" />
    <!-- 
     android:drawable="@drawable/user"用来指定对哪张图片裁剪,
     android:clipOrientation="horizontal"是水平裁剪,还是垂直裁剪
     android:gravity="left" 裁剪的方向是从左到右 -->

    /drawable/res/drawable/faceback.png
    /drawable/res/drawable/icon.png
    /drawable/res/drawable/layerlist.xml

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
      <!-- 使用两张照片合成一个新的照片:faceback,和user
       -->
       <!-- 指定需要合成的单个照片 
         android:top="68dp"
            android:right="18dp"
            android:bottom="22dp"
            android:left="18dp"
            android:id="@+id/userimage"
            如果不写这几句,照片会整个的占满整个屏幕
            这个xml的内容,可以在帮助文档中,找到:
            file:///G:/android/android-sdk-windows/docs/guide/topics/resources/drawable-resource.html#LayerList
            example:XML file saved at res/drawable/layers.xml: <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item>
          <bitmap android:src="@drawable/android_red"
            android:gravity="center" />
        </item>
        <item android:top="10dp" android:left="10dp">
          <bitmap android:src="@drawable/android_green"
            android:gravity="center" />
        </item>
        <item android:top="20dp" android:left="20dp">
          <bitmap android:src="@drawable/android_blue"
            android:gravity="center" />
        </item>
    </layer-list>
        -->
        <item android:drawable="@drawable/faceback" />
        
        <item android:drawable="@drawable/user"
            android:top="68dp"
            android:right="18dp"
            android:bottom="22dp"
            android:left="18dp"
            android:id="@+id/userimage"
            />
             <!-- android:id="@+id/userimage"使用这个属性给图片定义一个id 
             -->
            
    </layer-list>

    drawable/res/drawable/levellist.xml

    <?xml version="1.0" encoding="utf-8"?>
    <level-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- 这里只要是级别的值为0到10的时候显示这一张照片 -->
        <item android:drawable="@drawable/faceback" android:minLevel="0" android:maxLevel="10" />
        <item android:drawable="@drawable/user" android:minLevel="11" android:maxLevel="20"/>
    </level-list>

    drawable/res/drawable/rectangle.xml

      <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
       <!-- //渐变色,渐变角度270度 -->
        <gradient
            android:startColor="#FFFF0000"
            android:endColor="#80FF00FF"
            android:angle="270"/>
        <!-- //内间距 -->
        <padding android:left="7dp"
            android:top="7dp"
            android:right="7dp"
            android:bottom="7dp" />
        <!-- //圆角的大小 -->
        <corners android:radius="8dp" />
       <!-- //边界线,宽度2个像素,颜色:#FFFFFF,虚线的间隔线8个像素,间隔,也就是没有颜色的空隙
       //是2个像素 -->
        <stroke
            android:width="2dp"
            android:color="#FFFFFF"
            android:dashWidth="8dp"
            android:dashGap="4dp" />
    </shape>

    /drawable/res/drawable/statelist.xml

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
       <!--  注意这里所有的状态是可以组合使用的.比如这里指定,当这个控件
       被按下去,并且这个控件可用的时候显示这张图片
        -->
        <item android:state_pressed="true" android:state_enabled="true" android:drawable="@drawable/bg_selected" /> <!-- pressed -->
     <!--  //true:按下这个显示控件的时候,显示这张照片
     //false:没有按下这个显示控件的时候,显示这张照片 -->
        <item android:state_selected="true" android:drawable="@drawable/bg_selected" /> <!-- focused -->
       <!--  //true:当这个显示控件被选择的时候,显示这张照片
     //false:当这个显示控件不被选择的时候,显示这张照片 -->
        <item android:drawable="@drawable/bg_normal" /> <!-- default -->
        <!-- 这个代表匹配所有的状态,比如有一个状态发生了,这个状态先和前面的状态匹配,如果和前面
        的都不匹配,那么就和这个匹配 -->
    </selector>

    drawable/res/drawable/transition.xml

      <?xml version="1.0" encoding="utf-8"?>
    <transition xmlns:android="http://schemas.android.com/apk/res/android">
       <!-- 过度是需要在代码中控制的,这里要求当过度方式的时候,从这一张图片过度到下面的这一张图片 -->
        <item android:drawable="@drawable/bg_normal" />
        <item android:drawable="@drawable/bg_selected" />
    </transition>


    /drawable/res/drawable/user.png
    drawable/res/layout/main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
        <!-- 这里用一个imageView控件,实现图片的存放 
        android:src="@drawable/layerlist"
        这个imageview是用来测试,层列表图形的.
          android:src="@drawable/levellist"
       这个是用来测试,级别图形的.
        -->
     
    <ImageView  
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:src="@drawable/clip"
        android:id="@+id/imageView"
        />
    <!-- 点击按钮后,要求实现图片切换的功能 :-->
     <!-- android:background="@drawable/statelist" 
    这里用来测试,过度类型图形
    android:background="@drawable/transition"
    这里是用来测试形状类型图形的
     android:background="@drawable/rectangle"
     
     -->
     <Button
       android:background="@drawable/rectangle"
      android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="切换"
        android:onClick="changeImage"
     />
    </LinearLayout>
  • 相关阅读:
    MSBuild最佳实践
    Javascript:阻止浏览器默认右键事件,并显示定制内容
    zeptoJS:如何像jQuery一样,让滚动变得优雅?
    Javascript:DOM表格操作
    Javascript:getElementsByClassName
    Javascript:DOM动态创建元素实例应用
    Javascript:倒计时
    Javascript:sort()方法快速实现对数组排序
    探究css !important的应用之道
    Javascript:splice()方法实现对数组元素的插入、删除、替换及去重
  • 原文地址:https://www.cnblogs.com/lbangel/p/3486030.html
Copyright © 2011-2022 走看看