结合Android命名空间,自定义一个横向柱状图

话不多说先上图:

类似于这样的效果,很简单。这是一个listview,item是自定义的view,有两个特点:

  1. 传入长度,动态改变柱状图的长度;
  2. 根据长度改变色值,长度越长越红,反之越黄。

用到的知识点无非是paint在canvas上画图,这里不赘述,想了解但是不了解的童鞋可以看我上一篇日志。

传送门:http://blog.csdn.net/zhaoyingkun/article/details/44340365

在这里最想提到的一点是关于Android命名空间的使用。

是怎么想到的呢,我发现当我想往自定义的view中传入一个值如果按照常规的方式,只能使用setXXX()方法,但这个前提是此view对象已经被创建出来而且需要主动调用setXXX方法。怎么样才能在初始的时候就能像构造方法一样根据给定的值创建这个View呢?因为view的使用是在xml中使用的,不能去调用构造方法。那我们怎么办呢,这时候就需要使用命名空间了。也就是像xml中android:layout_height="20dp"这样给view赋值一样,这是二级结构的前面的android就是命名空间,只不过这个是android自己的而已。我们需要做的就是自己定义一个命名空间,我们可以拿过来用。

一、创建一个attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="BarChartView">
        <attr name="text" format="string" />
        <!-- bar_height表示定义的BarChartView的高度 -->
        <attr name="bar_height" format="integer" />
        <!-- bar_width表示定义的BarChartView的宽度 -->
        <attr name="bar_width" format="integer" />
    </declare-styleable>

</resources>

like this,declare-styleable,顾名思义,声明一个styleable类型,在我们下面的java代码中,我们还需要从这里边将属性取出来。

这里我们定义了两个int值:bar_height,bar_width,一个字符串值text。在下面我们马上就能用到它们。

二、布局文件中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    <span style="color:#ff0000;">xmlns:myxmlns="http://schemas.android.com/apk/res/com.example.simple"</span>
    android:layout_width="wrap_content"
    android:layout_height="match_parent" >

    <com.example.simple.BarChartView
        android:id="@+id/cv_chart"
        android:layout_width="wrap_content"
        android:layout_height="20dp"
        android:layout_centerVertical="true"
        <span style="color:#ff0000;">myxmlns:bar_height="40"</span> >
    </com.example.simple.BarChartView>

</RelativeLayout>

这是listview中作为item的view,注意红色部分,xmlns:myxmlns="http://schemas.android.com/apk/res/com.example.simple"。使用的规则为,首先定义命名空间xmlns:namespace-prefix="namespaceURI"。Android中xml中的使用是:xmlns:前缀=http://schemas.android.com/apk/res/ 应用程序包路径;然后使用的时候按格式:namespace-prefix(前缀):属性

myxmlns可以随便写,但要与下面的保持一致。这里我们就可以使用在上面的attrs.xml中定义的属性了,包括bar_height,bar_width,text等等上面你自定义的属性。

三、在代码中使用上面我们预设的属性

 public BarChartView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.BarChartView);
        chartHeight = a.getInt(R.styleable.BarChartView_bar_height, 20);
        chartWidth = a.getResourceId(R.styleable.BarChartView_bar_width, 10);
        a.recycle();
        chartHeight = DisplayUtils.Dp2Px(context, chartHeight);
    }

我们可以在自定义的view的构造方法中将我们预设的值用上面的方法得到,使用我们第一步中声明的styleable中将我们需要的属性得到。

这样我们的目的就达到了,使用了xml中预设的属性,不用再使用setXXX方法去传递view中的参数。

代码在github上,有需要的童鞋自行下载:

传送门:https://github.com/yocn/chartView.git

https://github.com/yocn/chartView

时间: 2024-10-13 08:36:59

结合Android命名空间,自定义一个横向柱状图的相关文章

Android如何自定义一个View(一)

首先,你需要在value文件夹下新建一个attr.xml文件(文件名可以任取,但不能有大写的字母开头). 内容大概有这些 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="CircleTip" > <attr name="circleTipColor" format="col

100行Android代码自定义一个流式布局-FlowLayout

首先来看一下 手淘HD - 商品详情 - 选择商品属性 页面的UI 商品有很多尺码,而且展现每个尺码所需要的View的大小也不同(主要是宽度),所以在从服务器端拉到数据之前,展现所有尺码所需要的行数和每一行的个数都无法确定,因此不能直接使用GridView或ListView. 如果使用LinearLayout呢? 一个LinearLayout只能显示一行,如果要展示多行,则每一行都要new一个LinearLayout出来,而且还必须要计算出每一个LinearLayout能容纳多少个尺码对应的Vi

Android自定义一个属于自己的时间钟表

1.概述 本文主要讲解的是如何自定义一个时间钟表,通过简单的练习可以简单学习android当中自定义view的一些常用绘图技巧,优化android绘图操作.言归正传,首先看下我们需要实现的效果: 当我们看到这个效果的时候脑子里应该有一定的思路了,我们应该把它分解成以下几个步骤: 1.仪表盘(圆) 2.刻度线(长 中 短) 3.刻度值(1-12) 4.指针(时  分  秒) 5.移动指针,计算指针位置 现在我们已经很清楚自己的思路了,那么我们一个一个来. 第一步:1.自定义View的属性,首先在r

android如何写一个自定义的dialog可以在Title的位置弹出来

先上效果图: Title的Layout为: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="@dimen/title_h

Android中如何优雅地自定义一个View

Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到一些坑,我把自己遇到的一些问题和解决方法总结一下,希望对广大码友们有所帮助. 注意点① 用xml定义Layout时,Root element 最好使用merge 当我们需要继承一个布局比较复杂的ViewGroup(比较多的是LinearLayout.RelativeLayout)时,通常会用xml来写布局,然后在自定义的View类中inflate这个定义了layout的xml文件. 首先

Android自定义控件——自定义组合控件

转载请注明出处http://blog.csdn.net/allen315410/article/details/39581055  前面几篇博文介绍了Android如何自定义控件,其实就是讲一下如何"从无到有"的自定义一个全新的控件,继承View或者继承ViewGroup,复写其相关方法,这种自定义控件的方式相对来说难度较大,而且并不是所有需要新控件的情况下,都要这样进行.有很多情况下,我们只要运用好Android给我提供好的控件,经过布局巧妙的结合在一起,就是一个新的控件,我称之为&

Android中自定义视图View之---前奏篇

前言 好长时间没写blog了,心里感觉有点空荡荡的,今天有时间就来写一个关于自定义视图的的blog吧.关于这篇blog,网上已经有很多案例了,其实没什么难度的.但是我们在开发的过程中有时候会用到一些自定义的View以达到我们所需要的效果.其实网上的很多案例我们看完之后,发现这部分没什么难度的,我总结了两点: 1.准备纸和笔,计算坐标 2.在onDraw方法中开始画图,invalidate方法刷新,onTouchEvent方法监听触摸事件 对于绘图相关的知识,之前在弄JavaSE相关的知识的时候,

【Android】自定义listview快速滚动条

http://blog.csdn.net/xyang81/article/details/17680333 在eoe上看到有个贴子通过反射,动态修改FastScroller对象的mThumbDrawable属性来改变快速滑动块的图标,这也不为于一种实现方式,但反射的效率较低.下面将介绍使用Style的方式来自定义图标. 从FastScroller类的init方法中可以得知,mThumbDrawable是通过获取当前Activity主题的android.R.attr.fastScrollThumb

Android面试通过一个控件展示自己水平

说好的博客,终于要来了. 这篇文章写一下面试时我自己一般是如何展示自己技术水平的. 我是一名做Android的攻城狮,自己的面试经验还算不错,作为求职者自己的面试成功率比较高,而技术关我从来还没遇到不通过的.我面试的时候喜欢先自己展现下自己的技术,然后再是面试官提问:这样让面试官能全面充分的了解我的技术层次,接下来谈薪水待遇自己的话语权就会多一些. 首先声明一点:我不喜欢在面试的时候多谈业务逻辑.多谈项目经验.多去展示自己对具体Api的记忆之类的行为.因为你所谈的项目和业务逻辑,都是需要和别人配