【android自己定义控件】自己定义View属性

1、自己定义View的属性

2、在View的构造方法中获得我们自己定义的属性

3、重写onMesure

4、重写onDraw

3这个步骤不是必须,当然了大部分情况下还是须要重写的。

1、自己定义View的属性,首先在res/values/  下建立一个attrs.xml , 在里面定义我们的属性和声明我们的整个样式。

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

    <attr name="txtName" format="string"/>
    <attr name="txtColor" format="color"/>
    <attr name="txtSize" format="dimension" />

    <declare-styleable name="titleStyle">
        <attr name="txtName"/>
        <attr name="txtColor"/>
        <attr name="txtSize"/>
    </declare-styleable>
</resources>

定义了字体,字体颜色,字体大小3个属性,format是值该属性的取值类型:

一共同拥有:string,color,demension,integer,enum,reference,float,boolean,fraction,flag;

编写的时候工具会提醒你使用哪种,不知道也能够Google搜索下

接下来就自己定义View

public class CustomTitleView extends View{

    private  String txtName;
    private int txtColor,txtSize;
    private  Paint mPaint;
    private Rect mBounds;

    public CustomTitleView(Context context) {
        this(context, null);
    }

    public CustomTitleView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);

    }

    public CustomTitleView(Context context, AttributeSet attrs, int defStyleAttr) {
           //详细操作
    }
}

定义完自己定义的View ,就该调用我们自己定义的View了。

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:title="http://schemas.android.com/apk/res/com.example.androidDemo"  《》
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.example.androidDemo.View.CustomTitleView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:padding="5dp"
        title:txtName="你好"
        title:txtColor="#ffffff"
        title:txtSize="16sp"/>
</RelativeLayout>

注意代码中的这行,自己定义命名空间,com.example.androidDemo是项目包路径

xmlns:title="http://schemas.android.com/apk/res/com.example.androidDemo"

使用自己定义命名空间:

        title:txtName="你好"
        title:txtColor="#ffffff"
        title:txtSize="16sp"

在View的构造方法中,获得我们的自己定义的样式

public class CustomTitleView extends View{

    private  String txtName;
    private int txtColor,txtSize;
    private  Paint mPaint;
    private Rect mBounds;

    public CustomTitleView(Context context) {
        this(context, null);
    }

    public CustomTitleView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);

    }

    public CustomTitleView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs,R.styleable.titleStyle,defStyleAttr,0);

        int n = typedArray.getIndexCount();

        for (int i = 0; i < n; i++){
            int attr = typedArray.getIndex(i);
            switch (attr){

                case 0:

                    txtName = typedArray.getString(attr);
                    break;
                case 1:

                    txtColor = typedArray.getColor(attr, Color.BLACK);
                    break;
                case 2:
                    txtSize = typedArray.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(
                            TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
                    break;

            }
        }
        typedArray.recycle();

        /**
         * 获得绘制文本的宽和高
         */
        mPaint = new Paint();
        mPaint.setTextSize(txtSize);
        // mPaint.setColor(mTitleTextColor);
        mBounds = new Rect();
        mPaint.getTextBounds(txtName, 0, txtName.length(), mBounds);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

            int widthMode = MeasureSpec.getMode(widthMeasureSpec);
            int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            int heightSize = MeasureSpec.getSize(heightMeasureSpec);
            int width;
            int height ;
            if (widthMode == MeasureSpec.EXACTLY)
            {
                width = widthSize;
            } else
            {
                mPaint.setTextSize(txtSize);
                mPaint.getTextBounds(txtName, 0, txtName.length(), mBounds);
                float textWidth = mBounds.width();
                int desired = (int) (getPaddingLeft() + textWidth + getPaddingRight());
                width = desired;
            }

            if (heightMode == MeasureSpec.EXACTLY)
            {
                height = heightSize;
            } else
            {
                mPaint.setTextSize(txtSize);
                mPaint.getTextBounds(txtName, 0, txtName.length(), mBounds);
                float textHeight = mBounds.height();
                int desired = (int) (getPaddingTop() + textHeight + getPaddingBottom());
                height = desired;
            }

            setMeasuredDimension(width, height);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        mPaint.setColor(Color.YELLOW);
        canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint);

        mPaint.setColor(txtColor);
        canvas.drawText(txtName, getWidth() / 2 - mBounds.width() / 2, getHeight() / 2 + mBounds.height() / 2, mPaint);

    }
}

当中

MeasureSpec.EXACTLY推断你传人的宽,高是不是精确赋值

android:layout_width="wrap_content"

android:layout_height="wrap_content"

假设是wrap_content,

 mPaint.setTextSize(txtSize);
                mPaint.getTextBounds(txtName, 0, txtName.length(), mBounds);
                float textWidth = mBounds.width();
                int desired = (int) (getPaddingLeft() + textWidth + getPaddingRight());
                width = desired;

假设是200dp这类精确的宽高值,

if (widthMode == MeasureSpec.EXACTLY)
            {
                width = widthSize;
            } 

效果图 ,是不是非常好用呢

时间: 2024-10-01 05:05:31

【android自己定义控件】自己定义View属性的相关文章

Android自己定义控件系列案例【五】

案例效果: 案例分析: 在开发银行相关client的时候或者开发在线支付相关client的时候常常要求用户绑定银行卡,当中银行卡号一般须要空格分隔显示.最常见的就是每4位数以空格进行分隔.以方便用户实时比对自己输入的卡号是否正确.当产品经理或UI设计师把这种需求拿给我们的时候.我们的大脑会立即告诉我们Android中有个EditText控件能够用来输入卡号,但好像没见过能够分隔显示的属性或方法啊.当我们睁大眼睛对着效果图正发呆的时候.突然发现当用户输入内容的时候还出现了清空图标,点击清空图标还能

Android自己定义控件之轮播图控件

背景 近期要做一个轮播图的效果.网上看了几篇文章.基本上都能找到实现,效果还挺不错,可是在写的时候感觉每次都要单独去又一次在Activity里写一堆代码.于是自己封装了一下.这里仅仅是做了下封装成一个控件,不必每次反复写代码了. 效果图 实现分析 轮播图的功能就是实现左右滑动的广告.图片信息展示,那我们就用ViewPager来实现,由于考虑到用户体验,我们还须要在以下加一个指示器来标示滑动到了第几张轮播图.指示器我们能够用一个线性布局来依据要展示的轮播图设置显示的View,我们要做这种一个控件没

从源码中浅析Android中如何利用attrs和styles定义控件

一直有个问题就是,Android中是如何通过布局文件,就能实现控件效果的不同呢?比如在布局文件中,我设置了一个TextView,给它设置了textColor,它就能够改变这个TextView的文本的颜色.这是如何做到的呢?我们分3个部分来看这个问题1.attrs.xml  2.styles.xml  3.看组件的源码. 1.attrs.xml: 我们知道Android的源码中有attrs.xml这个文件,这个文件实际上定义了所有的控件的属性,就是我们在布局文件中设置的各类属性 你可以找到attr

Android自己定义控件(状态提示图表)

[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重分享成果] 1 背景 前面分析那么多系统源代码了.也该暂停下来歇息一下,趁昨晚闲着看见一个有意思的需求就操练一下分析源代码后的实例演练--自己定义控件. 这个实例非常适合新手入门自己定义控件.先看下效果图: 横屏模式例如以下: 竖屏模式例如以下: 看见没有.这个控件全然自己定义的,连文字等都是自己定义的,没有不论什么图片等资源,就仅仅是一个小的java文件,这个界面仅仅有一个控件.例如以下咱们看下实现代

android 自己定义控件属性(TypedArray以及attrs解释)

近期在捣鼓android 自己定义控件属性,学到了TypedArray以及attrs.在这当中看了一篇大神博客Android 深入理解Android中的自己定义属性.我就更加深入学习力一番.我就沿着这个学习,讲一下流程吧,兴许一篇还有应用. 1.attrs文件编写 <?xml version="1.0" encoding="utf-8"?> <resources> <attr name="titleText" for

Android自己定义控件实战——仿多看阅读平移翻页

转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/38728119 之前自己做的一个APP须要用到翻页阅读,网上看过立体翻页效果,只是bug太多了还不兼容.看了一下多看阅读翻页是採用平移翻页的,于是就仿写了一个平移翻页的控件.效果例如以下: 在翻页时页面右边缘绘制了阴影.效果还不错.要实现这样的平移翻页控件并不难,仅仅须要定义一个布局管理页面就能够了. 详细实现上有下面难点: 1.循环翻页,页面的反复利用. 2.在翻页时过滤掉

Android 自己定义控件开发入门(二)

上一次我们讲了一堆实现自己定义控件的理论基础.列举了View类一些能够重写的方法,我们对这些方法的重写是我们继承View类来派生自己定义控件的关键 我通过一个最简单的样例给大家展示了这一个过程,不管是多么复杂的自己定义控件.思路总是这样子的,可是由于我们只重写了onDraw方法使得大家认为怪怪的.作为一个控件,我们竟然还要为了他的实现为其添加麻烦的监听,这就不能叫做控件了. 以下再给大家介绍一个常常重写的方法法:publicboolean onTouchEvent (MotionEvent ev

【Android】自己定义控件——仿天猫Indicator

今天来说说类似天猫的Banner中的小圆点是怎么做的(图中绿圈部分) 在学习自己定义控件之前,我用的是很二的方法,直接在布局中放入多个ImageView,然后代码中依据Pager切换来改变图片.这样的方法尽管能够在切换完毕后正确显示小圆点,可是却做不到例如以下图中的切换中的状态显示: 今天学到了自己定义控件,正好能够把这个坑填上. 说一下思路: 在ViewPager翻动的时候,会调用 public void onPageScrolled(int position, float positionO

Android应用之——自己定义控件ToggleButton

我们经常会看到非常多优秀的app上面都有一些非常美丽的控件,用户体验非常好.比方togglebutton就是一个非常好的样例,IOS系统以下那个精致的togglebutton现在在android以下也能够实现了,并且还能够自己定义它的颜色文字背景图,做出各种美丽的开关按键出来. 这里就用到了android里面一个比較经常使用的技术--自己定义控件. 先来看下我们实现的自己定义的togglebutton效果图:      自己定义控件的步骤: 1.首先,定义一个类继承View 或者View的子类,

android 自己定义控件

Android自己定义View实现非常easy 继承View,重写构造函数.onDraw.(onMeasure)等函数. 假设自己定义的View须要有自己定义的属性.须要在values下建立attrs.xml. 在当中定义你的属性. 在使用到自己定义View的xml布局文件里须要增加xmlns:前缀="http://schemas.android.com/apk/res/你的应用所在的包路径". 在使用自己定义属性的时候.使用前缀:属性名,如my:textColor="#FF