Android自定义控件属性

Android自定义控件属性的步骤:

1、在res/values/attrs.xml增加属性类型

        2、在调用自定义控件的布局文件中,增加名称控件,在自定义控件中设置属性值

        3、在自定义控件中读取设置的控件属性值

实例:

      第一:在res/values/attrs.xml增加属性类型;

<?xml version="1.0" encoding="utf-8"?>  
<!-- 定义属性内容 -->
<resources>
    <!-- Z_ImageViewTextLayout控件对应的属性
    Z_ImageViewTextLayoutAttr:style名称;通过style时attr名称来确定某一个属性
    --> 
    <declare-styleable name="<span style="color:#ff0000;">Z_ImageViewTextLayoutAttr</span>">  
         <attr name="imageWidth" format="dimension" />
         <attr name="imageHeight" format="dimension" />  
         <attr name="textBgWidth" format="dimension" />
         <attr name="textBgHeight" format="dimension" />
    </declare-styleable>  
    
</resources>


:在调用自定义控件的布局文件test_use.xml 中,增加名称控件,在自定义控件中设置属性值


<?xml version="1.0" encoding="utf-8"?>
<!--
xmlns:myview="http://schemas.android.com/apk/res/应用程序的包名"
myview为xml名称空间;
为应用程序所在的包名:com.hive
在控件定义中通过名称控件为自定义属性设置值
 -->
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myview="http://schemas.android.com/apk/res/应用程序的包名"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center" >
	<控件所在的包名.Z_ImageViewTextLayout
	    android:id="@+id/id_ctrl"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        myview:imageWidth="175dp"
        myview:imageHeight="120dp"
        myview:textBgWidth="168dp"
        myview:textBgHeight="30dp"
        />
 </LinearLayout>    


第三:在自定义控件中读取设置的控件属性值

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

/*
 * 动态创建控件
 */
public class Z_ImageViewTextLayout extends LinearLayout{
	private static final String TAG = Z_ImageViewTextLayout.class.getSimpleName();
	private ImageView imageView;
	private TextView textView;
	private Context context;
	private RectF rectf=null;
	private Paint paint;
	private int color;
	private BlurMaskFilter bmf=new BlurMaskFilter(3,BlurMaskFilter.Blur.OUTER);
	private int imageWidth;
	private int imageHeight;
	private int textBgWidht;
	private int textBgHeight;
	
	public Z_ImageViewTextLayout(Context context) {
		super(context);
		this.context=context;
		init();
		//创建控件
		createCtrl();
	}
	public Z_ImageViewTextLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.context=context;
		init();
		
		//读取属性值
		readAttr(attrs);
		
		//创建控件
		createCtrl();
	}

	public void init(){
		//设置该函数,否则自定义控件不会执行onDraw函数
		setWillNotDraw(false);
		
		//设置画笔颜色
		color = Color.WHITE;
		paint = new Paint();
		paint.setColor(color);
		
		//设置绘制图形的透明度
		paint.setAlpha(100);
		
		//设置paint的风格为空心;Paint.Style.FILL为实心
		paint.setStyle(Paint.Style.STROKE);
		
		//设置空心的外框的宽度
		paint.setStrokeWidth(10);
		
		// 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢
		paint.setAntiAlias(true);
				
		//设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰  
		paint.setDither(true);
		
		//可以用不同的MaskFilter实现滤镜的效果,如滤化,立体
		paint.setMaskFilter(bmf);
	}
	
	//读取属性值
	private void readAttr(AttributeSet attrs){
		//通过在属性文件中定义的名称,从attrs中获取具体的值
		TypedArray myAttr = context.obtainStyledAttributes(attrs,styleable.Z_ImageViewTextLayoutAttr);
		//读到值时对应的px,如果设置为dp,则会根据当前的设置转化为px,取出的值为对应的px
		imageWidth = myAttr.getDimensionPixelSize(R.styleable.Z_ImageViewTextLayoutAttr_imageWidth, 170);
		imageHeight = myAttr.getDimensionPixelSize(R.styleable.Z_ImageViewTextLayoutAttr_imageHeight, 110);
		textBgWidht = myAttr.getDimensionPixelSize(R.styleable.Z_ImageViewTextLayoutAttr_textBgWidth, 160);
		textBgHeight = myAttr.getDimensionPixelSize(R.styleable.Z_ImageViewTextLayoutAttr_textBgHeight, 20);
		myAttr.recycle();
	}

	//调用super.onDraw(canvas)时,先调用各子控件的onDraw,然后执行该函数的super.onDraw(canvas);之后的部分
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		drawUseRect(canvas);
	}

	//绘制边框;使用矩形绘制
	public void drawUseRect(Canvas canvas){
		//画边框,放在构造函数中,this.getWidth()获得的值为0
		if(rectf==null){
			rectf=new RectF(0,0,this.getWidth(),this.getHeight());
		}

		paint.setColor(color);
		canvas.drawRoundRect(rectf,8,5,paint);//第二个参数是x半径,第三个参数是y半径
		
	}

	public void setImageVisiblity(int visibility){
		imageView.setVisibility(visibility);
	}

	public void setTextVisiblity(int visibility){
		textView.setVisibility(visibility);
	}

	//设置内容
	public void setImageBitmap(Bitmap bitmap){
		imageView.setImageBitmap(bitmap);
	}

	public void setImageByResId(int resId){
		imageView.setBackgroundResource(resId);
	}

	public void setTitle(String title){
		textView.setText(title);
	}

	public void setTitleSize(int size){
		textView.setTextSize(size);
	}

	public void setTitleColor(int color){
		textView.setTextColor(color);
	}

	//创建控件
	public void createCtrl(){
		imageView = new ImageView(context);
		textView = new TextView(context);
		
		//设置整个布局的位置
		LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.FILL_PARENT,
				LinearLayout.LayoutParams.FILL_PARENT);
		setLayoutParams(params);
		setOrientation(VERTICAL);
		setGravity(Gravity.CENTER_HORIZONTAL);
		
		//设置控件的布局
		params = new LinearLayout.LayoutParams(imageWidth,imageHeight);
		params.setMargins(20, 20, 20, 0);
		params.gravity=Gravity.CENTER;
        imageView.setLayoutParams(params);
        addView(imageView);
        
		params= new LinearLayout.LayoutParams(textBgWidht,textBgHeight);
		//控件相对于布局的位置
		params.setMargins(0, 20, 0, 0);
		textView.setTextSize(12);
		textView.setLayoutParams(params);
		//设置控件在params所在的布局中居中
		textView.setGravity(Gravity.CENTER);
		
		//设置内容距离布局的位置
		textView.setPadding(20, 0, 20, 0);
		textView.setSingleLine(true);
		textView.setEllipsize(TextUtils.TruncateAt.valueOf("MARQUEE"));
		textView.setMarqueeRepeatLimit(-1);	
		addView(textView);
             
		
	}

	public ImageView getImageView() {
		return imageView;
	}
	public void setImageView(ImageView imageView) {
		this.imageView = imageView;
	}
	public TextView getTextView() {
		return textView;
	}
	public void setTextView(TextView textView) {
		this.textView = textView;
	}
}


其他:Paint类介绍

//
/**  
 * Paint类介绍  
 * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色,  
 * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法,  
 * 大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。         
 * 1.图形绘制  


 * setARGB(int a,int r,int g,int b);  


 * 设置绘制的颜色,a代表透明度,r,g,b代表颜色值。  


 *   


 * setAlpha(int a);  


 * 设置绘制图形的透明度。  


 *   


 * setColor(int color);  


 * 设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色。  


 *   


* setAntiAlias(boolean aa);  


 * 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。  


 *   


 * setDither(boolean dither);  


 * 设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰  


 *   


 * setFilterBitmap(boolean filter);  


 * 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示  


 * 速度,本设置项依赖于dither和xfermode的设置  


 *   


 * setMaskFilter(MaskFilter maskfilter);  


 * 设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等       *   


 * setColorFilter(ColorFilter colorfilter);  


 * 设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果  


 *   


 * setPathEffect(PathEffect effect);  


 * 设置绘制路径的效果,如点画线等  


 *   


 * setShader(Shader shader);  


 * 设置图像效果,使用Shader可以绘制出各种渐变效果  


 *  


 * setShadowLayer(float radius ,float dx,float dy,int color);  


 * 在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色  


 *   


 * setStyle(Paint.Style style);  


 * 设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE  


 *   


 * setStrokeCap(Paint.Cap cap);  


 * 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式  


 * Cap.ROUND,或方形样式Cap.SQUARE  


 *   


 * setSrokeJoin(Paint.Join join);  


 * 设置绘制时各图形的结合方式,如平滑效果等  


 *   


 * setStrokeWidth(float width);  


 * 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度  


 *   


 * setXfermode(Xfermode xfermode);  


 * 设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果  


 *   


 * 2.文本绘制  


 * setFakeBoldText(boolean fakeBoldText);  


 * 模拟实现粗体文字,设置在小字体上效果会非常差  


 *   


 * setSubpixelText(boolean subpixelText);  


 * 设置该项为true,将有助于文本在LCD屏幕上的显示效果  


 *   


 * setTextAlign(Paint.Align align);  


 * 设置绘制文字的对齐方向  


 *   


* setTextScaleX(float scaleX);  


* 设置绘制文字x轴的缩放比例,可以实现文字的拉伸的效果  


 *   


 * setTextSize(float textSize);  


 * 设置绘制文字的字号大小  


 *   


 * setTextSkewX(float skewX);  


 * 设置斜体文字,skewX为倾斜弧度  


 *   


 * setTypeface(Typeface typeface);  


 * 设置Typeface对象,即字体风格,包括粗体,斜体以及衬线体,非衬线体等  


 *   


 * setUnderlineText(boolean underlineText);  


 * 设置带有下划线的文字效果  


 *   


 * setStrikeThruText(boolean strikeThruText);  


 * 设置带有删除线的效果  


 *   


 */ 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值