Android自定义View

对于Android中的自定义View,我们可以使用系统的View组件,当然也可以根据需求来自定义我们想要

的View。

当系统提供的View不能够满足开发的需求,则需要定义一个定制的View
 *  分类:
 * 1、完全的自定义View 一般继承View并重写相应的方法绘制View组件
 * 2、继承已有的组件:比如继承EditText并扩展其功能,
 * 3、组合定义View组件:继承ViewGroup(RadioGroup,LinearLayou),将多个小的组件组成一个大的View

首先创建一个类MyView继承View:

package com.example.text02;

import android.content.Context;
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.RectF;
import android.support.v4.widget.SlidingPaneLayout.PanelSlideListener;
import android.util.AttributeSet;
import android.view.View;
/**
 * 步骤:
 * 1、定义一个子类继承View
 * 2、实现两个构造方法public MyView(Context context)代码创建
 * 			public MyView(Context context, AttributeSet attrs)布局使用
 * 3、绘制的内容定义在onDraw()中
 * 4、内容大小:onMeasure 参数 getMode() getSize()
 * @author Administrator
 *
 */
public class MyView extends View {
	
	private Paint paint;//定义一个画笔对象
	/**
	 * Button btn = new Button(this);
	 * 该构造方法必须被实现,用于在代码中创建MyView对象
	 * @param context
	 */
	public MyView(Context context) {
		super(context);
		initPaint();
	}
	/**
	 * 如果该组件是通过布局来创建,则该构造方法必须被创建,如果没有该构造方法会报异常NoSuchMethodException
	 * @param context:上下文
	 * @param attrs:属性集合对象
	 */
	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initPaint();
	}

	/**
	 * 初始化画笔,画笔如果在onDraw()里面,会多次被调用,造成资源浪费
	 */
	private void initPaint(){
		paint= new Paint();
		paint.setColor(Color.RED);//设置画笔颜色
		paint.setTextSize(18);//设置大小
		//抗锯齿方法
		paint.setAntiAlias(true);
//		paint.setStyle(Paint.Style.STROKE);//空心 FILL:实心
	}
	
	/**
	 * 主要用于绘制组件 
	 * 参数:canvas	画布:画布提供了绘制不同图形的方法,通过调用画布的方法可以完成图形的绘制
	 * 通常要结合Paint画笔使用,它提供了绘制图形的颜色,线条的粗细等。
	 */
	@Override
	protected void onDraw(Canvas canvas) {
		
		super.onDraw(canvas);
		//图形的绘制
		//绘制一条线     第1、2个参数:起始点坐标,第3、4参数结束点坐标
//		canvas.drawLine(10, 10, 100, 100, paint);
		//绘制圆形
//		canvas.drawCircle(100, 100, 50, paint);
		//绘制矩形:
		//左侧的值:矩形左侧这条线距离手机左边缘的距离,矩形的长度 = right - left
		//矩形的宽度:bottom - top
//		canvas.drawRect(100, 100, 150, 150, paint);
		//绘制弧线
//		RectF rectF = new RectF(50, 50, 200, 200);
//		canvas.drawArc(rectF, 0, 150, true, paint);
		//绘制文本
//		canvas.drawText("你好啊!", 50, 50, paint);
		//绘制图片
//		canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher), 50, 50, paint);
		//绘制按钮
		canvas.drawColor(Color.GRAY);//背景色
		canvas.drawText("按钮", 50, 50, paint);
	}
	/**
	 * 重写另一个方法
	 * widthMeasureSpec:父容器的宽度
	 * heightMeasureSpec:父容器的高度
	 */
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		//获取父容器的宽度和高度
		//mode种类:MeasureSpec.AT_MOST:wrap_content
		//MeasureSpec.EXACTLY: match_parent 指定大小100dp
		int wMode = MeasureSpec.getMode(widthMeasureSpec);
		int hMode = MeasureSpec.getMode(heightMeasureSpec);
		
		//获取父容器所允许的最大的宽度和高度
		int wSize = MeasureSpec.getSize(widthMeasureSpec);
		int hSize = MeasureSpec.getSize(heightMeasureSpec);
		//根据Mode指定宽度或高度的大小
		switch (wMode) {
		case MeasureSpec.AT_MOST:
			wSize = 100;
			break;
		case MeasureSpec.EXACTLY:
			wSize = 200;
			break;

		default:
			break;
		}
		//计算高度
		switch (hMode) {
		case MeasureSpec.AT_MOST:
			hSize = 70;
			break;
		case MeasureSpec.EXACTLY:
			hSize = 200;
			break;

		default:
			break;
		}
		//设置宽高比
		setMeasuredDimension(wSize, hSize);
	}

}
然后在布局文件中引用我们自定义的View:

<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="match_parent"
    android:padding="10dp" >

    <!-- 自定义View添加到布局中 -->

    <com.example.text02.MyView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>
运行结果比较简单,这里我们就不展示了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值