Android自定义组件的属性

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

原文地址:http://blog.csdn.net/ab_ba/article/details/7928711

当要编写自己的widget或者其他view组件时,能够定义自己的属性标签是很重要的,这让我们能够彻底定制view的外观。

     知识点:

     1.自定义属性标签及其格式属性。

     2.如何创建自己的View。

     3.如何使用自己的View。


一、自定义属性标签及其格式属性

     在res/values下创建文件attrs.xml。先看一段其中的代码:

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<declare-styleable name="MyView">
		<attr
			name="textColor"
			format="color" />
		<attr
			name="textSize"
			format="dimension" />
		<attr
			name="background" 
			format="reference"
		/>
	</declare-styleable>
</resources>

这里定义了一个样式属性资源。名字就是MyView,然后有三个属性,文字的颜色,文字的大小,View的背景图片。可以看到attr除了name属性以外,还有一个format属性,它规定了这个属性的数据类型。这个format属性有很多,除了上面的color,dimension,reference以外,还有

         reference:参考某一资源ID。

         color:颜色值。

         boolean:布尔值。

         dimension:尺寸值。

         float:浮点值。

         integer:整型值。

         string:字符串。

         fraction:百分数。

         enum:枚举值。

         flag:位或运算。


二、如何创建自己的View

         继承View或者它的子类,然后重写构造函数和onDraw函数。看看代码:

package com.wenix;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

public class MyView extends View {
	private static final String TAG = "MyView";
	private Paint mPaint;
	Drawable background;
	
	public MyView(Context context) {
		// TODO Auto-generated constructor stub
		super(context);
	}
	
	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		mPaint = new Paint();
		TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyView);//得到属性数组
		
		int textColor = a.getColor(R.styleable.MyView_textColor, Color.BLUE);//得到属性值,可以指定默认值,防止空值,注意引用名。
		float textSize = a.getDimension(R.styleable.MyView_textSize, 22);//注意get方法,跟format是一致的。
		background = a.getDrawable(R.styleable.MyView_background);
		
		mPaint.setColor(textColor);
		mPaint.setTextSize(textSize);
		
		a.recycle();//一定要recycle以下来保证属性值一致。
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		mPaint.setStyle(Style.FILL);

		Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.myview_background);
		canvas.drawBitmap(bitmap, 0, 0, mPaint);
//		Matrix matrix = new Matrix();
//		matrix.postScale(0, 0, 480, 800);
//		canvas.drawBitmap(bitmap, matrix, mPaint);
		
		
		mPaint.setColor(Color.RED);
		canvas.drawText("hello,world!", 20, 55, mPaint);
	}

}

三、如何使用自定义View

      有了自定义属性数组,又有了自定义View,下面说说怎么使用自定义View吧。看main.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	 xmlns:wenix="http://schemas.android.com/apk/res/com.wenix"  //最重要的就是这个命名空间,xmlns后写上你自己的标签,下面就可以引用属性
    android:orientation="vertical"                                   //了,res/后面跟上控件所在包的包名。
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/background"
    >
	<com.wenix.MyView
		android:id="@+id/myview"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		wenix:textColor="#ffffffff"       //使用上面定义的标签来引用属性。
		wenix:textSize="22dp"/>
</LinearLayout>

然后去要用的地方用吧,看看MainActivity.java代码:

<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><div style="position: absolute; left: 0px; top: 0px; width: 0px; height: 0px; z-index: 99;"><embed id="ZeroClipboardMovie_5" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="0" height="0" name="ZeroClipboardMovie_5" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&width=0&height=0" wmode="transparent"></div></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">package</span><span> com.wenix;  </span></span></li><li class=""><span>  </span></li><li class="alt"><span><span class="keyword">import</span><span> android.app.Activity;  </span></span></li><li class=""><span><span class="keyword">import</span><span> android.os.Bundle;  </span></span></li><li class="alt"><span><span class="keyword">import</span><span> android.util.DisplayMetrics;  </span></span></li><li class=""><span><span class="keyword">import</span><span> android.util.Log;  </span></span></li><li class="alt"><span><span class="keyword">import</span><span> android.view.View;  </span></span></li><li class=""><span><span class="keyword">import</span><span> android.view.View.OnClickListener;  </span></span></li><li class="alt"><span><span class="keyword">import</span><span> android.widget.Toast;  </span></span></li><li class=""><span>  </span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> MainActivity </span><span class="keyword">extends</span><span> Activity {  </span></span></li><li class=""><span>    <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> String TAG = </span><span class="string">"MainActivity"</span><span>;  </span></span></li><li class="alt"><span>    MyView myView;  </span></li><li class=""><span>    <span class="comment">/** Called when the activity is first created. */</span><span>  </span></span></li><li class="alt"><span>    <span class="annotation">@Override</span><span>  </span></span></li><li class=""><span>    <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> onCreate(Bundle savedInstanceState) {  </span></span></li><li class="alt"><span>        <span class="keyword">super</span><span>.onCreate(savedInstanceState);  </span></span></li><li class=""><span>        setContentView(R.layout.main);  </span></li><li class="alt"><span>          </span></li><li class=""><span>        myView = (MyView)findViewById(R.id.myview);  </span></li><li class="alt"><span>        myView.setOnClickListener(<span class="keyword">new</span><span> OnClickListener() {  </span></span></li><li class=""><span>              </span></li><li class="alt"><span>            <span class="annotation">@Override</span><span>  </span></span></li><li class=""><span>            <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> onClick(View v) {  </span></span></li><li class="alt"><span>                <span class="comment">// TODO Auto-generated method stub</span><span>  </span></span></li><li class=""><span>                Toast.makeText(MainActivity.<span class="keyword">this</span><span>, </span><span class="string">"onClick"</span><span>, Toast.LENGTH_LONG).show();  </span></span></li><li class="alt"><span>            }  </span></li><li class=""><span>        });  </span></li><li class="alt"><span>          </span></li><li class=""><span>        DisplayMetrics dm = <span class="keyword">new</span><span> DisplayMetrics();  </span></span></li><li class="alt"><span>        getWindowManager().getDefaultDisplay().getMetrics(dm);  </span></li><li class=""><span>        Log.i(TAG,<span class="string">"screen width="</span><span>+dm.widthPixels+</span><span class="string">",screen height="</span><span>+dm.heightPixels);</span><span class="comment">//顺便写了段检测屏幕大小的代码。</span><span>  </span></span></li><li class="alt"><span>    }  </span></li><li class=""><span>}  </span></li></ol></div><pre name="code" class="java" style="display: none;">package com.wenix;

import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

public class MainActivity extends Activity {
	private static final String TAG = "MainActivity";
	MyView myView;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        myView = (MyView)findViewById(R.id.myview);
        myView.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, "onClick", Toast.LENGTH_LONG).show();
			}
		});
        
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        Log.i(TAG,"screen width="+dm.widthPixels+",screen height="+dm.heightPixels);//顺便写了段检测屏幕大小的代码。
    }
}</pre><br>
<p></p>
<pre></pre>
<br>
<p></p>
<p>     最后上效果图:</p>
<p><img src="https://img-my.csdn.net/uploads/201208/31/1346391048_7936.png" alt=""><br>
</p>
<p><br>
</p>
<br>


Android开发之自定义UI组件属性 Android系统虽然自带了很多的组件,但肯定满足我们个性化的需求,所以我们为了开发方便,需要自定义Android的UI组件,以实现我们个性化的需求。 自定义组合控件的步骤: 1 、自定一个View,需要继承相对布局,线性布局等ViewGroup的子类。ViewGroup是一个其他控件的容器,能够乘放各种组件。 2 、实现父类的3个构造方法。一般需要在构造方法里始化初自定义布局文件。 阅读详情

相关推荐

通义千问语言模型Qwen2.5架构详解

此外,将基于API的模型 Qwen-Plus 与领先的专有和开源模型进行了对比,包括 GPT4-o、Claude-3.5-Sonnet、Llama-3.1-405B和DeepSeek-V2.5。Qwen2.5-Math-72B-Instruct的整体性能超越了Qwen2-Math-72B-Instruct和GPT4-o,甚至是非常小的专业模型如 Qwen2.5-Math-1.5B-Instruct也能在与大型语言模型的竞争中取得高度竞争力的表现。近来也出现了明显的转向小型语言模型(SLMs)的趋势。

搏博的专栏 1万+

Android自定义View组件里传值

今天遇到个问题,需要往自定义View里传值,试了很多种方法都不行,最后找到了一个最有效,且最简单的方法。 方法是:给自定义组件设置个id,用findViewbyId(R.id.xxx)的方法初始化,不要用new+类名的方法,不好使,然后在自定义控件那个类里设置个带参数的构造方法,用 实例化出来的组件点出构造方法,把想传的参数传进去,就ok了,简单明了。

grp0916的专栏 8518

【数据集】全球首个10米分辨率精细分类土地覆盖数据集GLC_FCS10

【数据集】全球首个10米分辨率精细分类土地覆盖数据集GLC_FCS10

WW、forever的博客 1541

android 自定义组件 属性值,自定义组件自定义属性

一、组件属性我们在布局文件中使用组件时,定义组件的宽、高、背景等属性,这些属性我们并没有特意去定义,它们都是组件的默认属性,在我们sdk安装目录下找到:sdk\platforms\android-25\data\res\values\attrs.xml.这里面定义了组件的默认属性,例如View的属性:..............省略.......二、自定义属性自定义组件时,我们常常需要自定义属...

weixin_42525637的博客 790

Android自定义组件:1、什么是自定义组件自定义组件的方式、定义自定义属性

一、什么是自定义组件 Android为我们提供了丰富的 UI组件,基本的应用已经足够了,但在实际开发中,如果我们想构建更加复杂的 UI视图,此时就需要使用自定义组件了。 二、自定义组件的方式 自定义组件的三种方式: 1、组合现有组件 组合现有Android默认提供的组件,继承ViewGroup或其子Layout类等布局类进行组合。 2、在某一个组件上进行扩展 调整现有Android默......

鲁迷那的专栏—坚持实践后再写出来! 2559

android自定义组件属性,Android自定义组件

Android提供了一个预建的部件,如Button, TextView, EditText, ListView, CheckBox, RadioButton, Gallery, Spinner, AutoCompleteTextView等可以直接使用在Android应用程序开发中,但有可能还有一种情况,当不满意现有可用的窗口小部件的功能。 Android 提供创建自定义组件功能,定制以满足需求。如...

weixin_42204930的博客 302

android自定义组件属性,android自定义组件属性

maind.xml文件aaaa:duration="yaoyuwen"--->此属性自定义属性encoding="utf-8"?>xmlns:aaaa="http://schemas.android.com/apk/res/com.huaqian.attribute"————>引入自定义属性的文件,com.huaqian.attribute为应用程序的文件包android:l...

weixin_29796903的博客 188

Android自定义组件:2、如何实现和使用自定义组件自定义属性

目录 一、前言 二、如何实现自定义组件 步骤1:写 attrs.xml 资源文件 1、attrs.xml 文件 和 R 文件对应关系 2、attrs.xml 文件重点注意 (1)declare-styleable子元素 (2)attrs.xml 文件只做属性的描述 步骤2:写自定义类 步骤3:使用自定义组件 一、前言 上一篇文章我们介绍了:什么是自定义组件自定义组件的方式、......

鲁迷那的专栏—坚持实践后再写出来! 3672

android 自定义属性通过反射关联组件与方法

关于Android自定义属性的使用网上已经有很多介绍了,比如: http://gundumw100.iteye.com/blog/1040917 在Button组件里有android:onClick属性,其值是点击Button时触发的方法的名称。我这里想说的就是添加这种属性方法的方法。比如我们现在有这样一个自定义组件: 它是由一个TextView,一个SeekBar,再加一个TextV

pingchuanyang的茅坑 1033

对于android自定义组件属性的理解

对于android自定义组件都会采用三种方式来实现,即自定义View

yaya_soft的专栏 940

Android自定义组件和它的属性

好长时间没有更新博客了,本来想积累点有深度的东西发,但一直没有找到很好的点。所以,写一些基础的东西,就当积累吧。 Android开发中难免会用到自定义组件,下面以ImageButton为例来介绍怎么自定义组件和它的属性: 第一步、在values/attrs.xml中为组件自定义属性

wode_dream的专栏 1240

Android定制组件之图文 (自定义组件图) + TableLayout属性

传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229         今天我们学习如何自定义TextView组件,让它既能显示文本,又能显示图像,达到“图文并茂”的效果。这种图文混搭的方式常常被用来展现新闻、文章、彩信等内容。下面给出该情景的案例: 1案例技术要点 1.1创建attrs.xml文件用于设置自定义组件属性、类型和样式

moubenmao的专栏 2160

android图像图像处理——自定义组件属性

自定义组件属性步骤如下【1】在Values资源文件下新建myview.xml<resources> <declare-styleable name="myview"> <attr name="myview_background" format="reference"/> <attr name="myview_paintwidth" format="refer

TaoLee 2768

android自定义组件属性

1.在resource中使用declare-styleable定义组件属性 2.在布局配置文件中声明应用的命名空间 xmlns:myAttrs="http://schemas.android.com/apk/res/XXX" XXX指的是AndroidManifest.xml文件中manifest元素的package属性值...

snowolf9929 484

Android 自定义组件属性方式

 Android自定义属性(attrs.xml,TypedArray的使用) 2012年05月01日 ⁄ Android 编程 ⁄ 暂无评论 ⁄ 被围观 3,391 次+ 做Android布局是件很享受的事,这得益于他良好的xml方式。使用xml可以快速有效的为软件定义界面。可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了。那么如何

wy1987_708的专栏 678

android自定义组件属性,Android自定义控件(二,自定义属性)

自定义控件相关目录:前言上篇介绍了自定义控件的基本要求以及绘制的基本原理,本篇文章主要介绍如何给自定义控件自定义一些属性。本篇文章将继续以上篇文章自定义圆形百分比为例进行讲解。有关原理知识请参考Android自定义控件之基本原理需求产生背景:为何要引入自定义属性?当Android提供的原生属性不能满足实际的需求的时候,比如我们需要自定义圆形百分比半径大小、圆形背景、圆形显示的位置、圆形进度的背景等...

weixin_42445142的博客 202

android自定义组件属性,Android自定义控件之自定义属性 format详解

Android 自定义View 控件己经不是什么新鲜话题,Android Api提供了一大堆基础组件给我们,需要什么特定功能还需要我们继承它们然后定制更加丰富的功能。这里介绍一下自定义属性formatreference:参考某一资源ID。(1)属性定义:(2)属性使用:android:layout_width = "42dip"android:layout...

weixin_34725044的博客 168

Android自定义组件自定义属性

有时候在做开发的时候,android提供给我们的视图并不能满足我们的要求,所以有时候我们需要自己创建自己的view。 我们只需要将我们想要的继承于View,然后重写里面的方法就可以了。 package com.example.view; import android.content.Context; import android.graphics.Color; import android.

大罗说事 1万+

android自定义组件属性,Android组合控件详解 & 自定义属性

组合控件详解 & 自定义属性组合控件是自定义控件的一种,只不过它是由其他几个原生控件组合而成,故名组合控件。在实际项目中,GUI 会遇到一些可以提取出来做成自定义控件情况。一个自定义控件的好处就是把一些需要模块化的 UI 和逻辑放在一起,做到了高内聚,向其他模块提供接口并很少依赖外界,这样就是低耦合。一个自定义控件就是一个封闭的王国,这里由你掌控。上述是我自己的一个体会,想必大家也会常做自...

weixin_35689019的博客 557

android自定义组件属性,android自定义控件并添加属性的方法以及示例

安卓系统为我们提供了丰富的控件,但是在实际项目中我们仍然需要重新通过布局来实现一些效果,比如我们需要一个上面图标,下面文字的button,类似于下面这样的:最直接的解决办法是通过将imageview和textview放在一个垂直排列的LinearLayout中,如下:android:layout_width="fill_parent"android:layout_height="fill_pare...

weixin_39986973的博客 608

说说Android 两种为自定义组件添加属性的使用方法和区别(转)

[size=large][b]转自:http://www.cnblogs.com/TerryBlog/archive/2010/11/03/1868431.html[/b][/size] Android 自定义View 己经不是什么新鲜话题,Android Api提供了一大堆基础组件给我们,需要什么特定功能还需要我们继承它们然后定制更加丰富的功能。前面有篇文章也说过为自定义VIEW添加属...

iteye_9107的博客 149
上一篇: Android中的Handler机制
下一篇: java泛型
k_t_feng
博客等级 码龄12年 1粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值