Android自定义控件之自定义属性的添加 -(2)

还是前面例子中的问题,如果想在xml中设置球的半径,应该怎么办?我们先了解下自定义属性的知识。

一、属性文件中format

首先我们要查看values目录下是否有attrs.xml,如果没有要创建一个。

format可选项

reference //引用

color

boolean

dimension  /尺寸

float

integer

string

fraction //百分数,如200%

下面再自定义几个属性,在attrs.xml文件中,如下

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

    <declare-styleable name="BallView">
        <attr name="BallColor" format="color"/>
        <attr name="BallRadius"  format="float"/>
        <attr name="BallStartX" format="float"/>
        <attr name="BallStartY" format="float"/>
    </declare-styleable>
</resources>

其中BallView中用来在java代码中找到这些数据。

布局文件中如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <chuiyuan.lsj.androidjava.utils.BallView2
        xmlns:ballview="http://schemas.android.com/apk/res-auto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        ballview:BallRadius="20"
        />

</LinearLayout>

注意BallView2中的xmlns,使用的是res-auto。

二、示例

接下来是BallView2的代码,构造函数是重点,我们获取定义的属性,获取方法后面通常会设置默认值,以免我们在xml文件中没有定义。获取属性使用  名字_属性  连接起来。TypedArray通常最后调用 recycle()方法,以保持以后使用属性时的一致性。 

package chuiyuan.lsj.androidjava.utils;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import chuiyuan.lsj.androidjava.R;

/**
 * Created by lsj on 2015/9/26.e
 */
public class BallView2  extends View{
    private float x ;
    private float y ;
    private float r  ;
    private int color ;

    public BallView2(Context context){
        super(context, null);
    }
    public BallView2(Context context, AttributeSet attrs){
        super(context, attrs);
        //得到自定义的属性
        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.BallView) ;
        //在xml没有定义这个属性时,使用默认值 30
        x = ta.getFloat(R.styleable.BallView_BallStartX,30) ;
        y = ta.getFloat(R.styleable.BallView_BallStartY,30);
        r = ta.getFloat(R.styleable.BallView_BallRadius,30);
        color = ta.getColor(R.styleable.BallView_BallColor, Color.GREEN);

        ta.recycle(); //一定要
    }

    @Override
    public void onDraw(Canvas canvas){
        Paint paint = new Paint() ;
        paint.setColor(color);
        canvas.drawCircle(x, y, r, paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        x = event.getX();
        y = event.getY();
        invalidate(); //刷新
        return  true;  //成功
    }
}

结束 。。  

  

时间: 2024-08-12 19:17:25

Android自定义控件之自定义属性的添加 -(2)的相关文章

android自定义控件(三) 自定义属性

书接上回 在xml里建立属性,然后java代码里用typedArray获得这些属性,得到属性后,利用属性做一些事.例:得到xml里的color,赋给paint. 1.在res/values/下新建attrs.xml [html] view plaincopy <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="CustomVie

Android自定义控件之自定义ViewGroup实现标签云(四)

前言: 前面几篇讲了自定义控件绘制原理Android自定义控件之基本原理(一),自定义属性Android自定义控件之自定义属性(二),自定义组合控件Android自定义控件之自定义组合控件(三),常言道:“好记性不如烂笔头,光说不练假把式!!!”,作为一名学渣就是因为没有遵循这句名言才沦落于此,所以要谨遵教诲,注重理论与实践相结合,今天通过自定义ViewGroup来实现一下项目中用到的标签云. 需求背景: 公司需要实现一个知识点的标签显示,每个标签的长度未知,如下图所示 基本绘制流程: 绘制原理

Android自定义控件之自定义组合控件(三)

前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本. 使用自定义组合控件的好处? 我们在项目开发中经常会遇见很多相似或者相同的布局,比如APP的标题栏,我们从三种方式实现标题栏来对比自定义组件带来的好处,毕竟好的东西还是以提高开发效率,降低开发成本为导向的. 1.)第一种方式:直接在每个xml布局中写相同的标题栏布局代码 <?xm

Android自定义控件并且使其可以在xml中自定义属性

为什么要自定义View android开发中自定义View的好处是显而易见的.比如说下面的这个顶部导航,它被设计出现在应用的每个界面,但每次的内容却不尽相同.我们不能在每个layout资源中都配置一组相同的View吧?如果使用<include layou="@layout/xxx"/>标签,虽然解决了布局文件的重用性,但是相关View的初始化设置还是没能够重用(集中),需要每次都采用view.findViewById(id)来初始化他们. 有了对"可重用性&quo

Android自定义控件系列三:自定义开关按钮(三)--- 自定义属性

尊重原创,转载请注明出处:http://blog.csdn.net/cyp331203/article/details/40855377 接之前的:Android自定义控件系列二:自定义开关按钮(一)和Android自定义控件系列三:自定义开关按钮(二)继续,今天要讲的就是如何在自定义控件中使用自定义属性,实际上这里有两种方法,一种是配合XML属性资源文件的方式,另一种是不需要XML资源文件的方式:下面我们分别来看看: 一.配合XML属性资源文件来使用自定义属性: 那么还是针对我们之前写的自定义

Android开发技巧——自定义控件之自定义属性

Android开发技巧--自定义控件之自定义属性 掌握自定义控件是很重要的,因为通过自定义控件,能够:解决UI问题,优化布局性能,简化布局代码. 上一篇讲了如何通过xml把几个控件组织起来,并继承某个ViewGroup子类,把它们封装起来使用.这是我们接触到的最简单的一种自定制控件了.但许多时候,我们还需要在布局文件中使用它们的时候,能通过属性传入一些值,来影响最终的显示结果. 我们在做项目中经常会遇到的一个情况:一张图片加一个文本的组合.比如充值账户成功之后显示的一个界面,上面是一个表示成功的

Android自定义控件系列二:如何自定义属性

上一篇Android自定义控件系列一:如何测量控件尺寸 我们讲了如何确定控件的属性,这篇接着也是讲个必要的知识-如何自定义属性.对于一个完整的或者说真正有实用价值的控件,自定义属性是必不可少的. 如何为控件定义属性 在res/values/attrs.xml(attrs.xml如果不存在,可以创建个)中使用<declare-styleable>标签定义属性,比如我想定义个显示头像的圆形的图片控件(AvatarImageView): 01.<?xml version="1.0&q

Android自定义控件——自定义属性

转载请注明出处:http://blog.csdn.net/allen315410/article/details/39343401 我们在自定义android组件的时候,除了用Java构建出组件的样子外,有时候还需要去申明一些"属性"提供给项目使用,那么什么是组件的属性呢? 例如在清单文件中,创建一个TextView的时候,这是需要制定TextView的android:layout_width="wrap_content" android:layout_height

【自定义控件】自定义属性

做 Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速 有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方提供的那些组件一样用xml 来定义他的属性呢?现在我们就来讨论一下他的用法. 一.在res/values文件下定义一个attrs.xml文件,代码如下: <?xml version="1.0" encoding="utf-8"?>  <resour