自定义view(一 <文本>)
来源:互联网 发布:武汉北大青鸟php培训 编辑:程序博客网 时间:2024/05/22 10:32
本文转载是看了鸿洋大神的自定义view自己跟着写了一遍加上了一些注释。如果想更详细的了解请参考原文:http://blog.csdn.net/lmj623565791/article/details/24252901
1、自定义View的属性
2、在View的构造方法中获得我们自定义的属性
[ 3、重写onMesure ]
4、重写onDraw
我把3用[]标出了,所以说3不一定是必须的,当然了大部分情况下还是需要重写的。
1、自定义View的属性,首先在res/values/ 下建立一个attrs.xml , 在里面定义我们的属性和声明我们的整个样式。
<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="CustomView"> <attr name="customText" format="string" /> <attr name="customTextColor" format="color" /> <attr name="customTextSize" format="dimension" /> </declare-styleable></resources>
我们定义了字体,字体颜色,字体大小3个属性,format是值该属性的取值类型:
一共有:string,color,demension,integer,enum,reference,float,boolean,fraction,flag;不清楚的可以google一把。
然后在布局中声明我们的自定义View
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <zdd.customview.hongyangview.CustomView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:padding="5dp" app:customText="点我有惊喜" app:customTextColor="#ff00ff" app:customTextSize="40sp" /></RelativeLayout>一定要引入 xmlns:custom="http://schemas.android.com/apk/res/com.example.customview01"(这个我的不行。不知道原因)或者
xmlns:app="http://schemas.android.com/apk/res-auto"我们的命名空间,后面的包路径指的是项目的package
2、在View的构造方法中,获得我们的自定义的样式
package zdd.customview.hongyangview;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.util.AttributeSet;import android.util.TypedValue;import android.view.View;import java.util.ArrayList;import java.util.List;import java.util.Random;import zdd.customview.R;/** * Created by ZDD on 2016/7/28. */public class CustomView extends View implements View.OnClickListener { // 定义控件属性值 private String customText; private int customTextColor; private int customTextSize; // 定义画笔 private Paint paint; // 绘制矩形 private Rect rect; public CustomView(Context context) { this(context, null); } public CustomView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CustomView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CustomView); // 获取到自定义属性的数量 int arrChild = array.getIndexCount(); for (int i = 0; i < arrChild; i++) { // 获取到自定义属性的索引值 int child = array.getIndex(i); switch (child) { case R.styleable.CustomView_customText: customText = array.getString(child); break; case R.styleable.CustomView_customTextColor: customTextColor = array.getColor(child, 0); break; case R.styleable.CustomView_customTextSize: customTextSize = (int) array.getDimension(child, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics())); break; } } paint = new Paint(); // 设置文字大小 paint.setTextSize(customTextSize); // 初始化矩形 rect = new Rect(); // 根据填充的数据返回rect的具体宽高 第一个参数是文字,第二个参数是从0开始绘制 第三个参数是到文字的结束停止绘制, 第四个是矩形 paint.getTextBounds(customText, 0, customText.length(), rect); // 添加点击事件 setOnClickListener(this); } @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 = 0; int height = 0;// 重写之前先了解MeasureSpec的specMode,一共三种类型:// EXACTLY:一般是设置了明确的值或者是MATCH_PARENT// AT_MOST:表示子布局限制在一个最大值内,一般为WARP_CONTENT// UNSPECIFIED:表示子布局想要多大就多大,很少使用 if (widthMode == MeasureSpec.EXACTLY) { // 如果设置的是match_parent width = widthSize; } else { // 设置文字大小 paint.setTextSize(customTextSize); // 将文字绘制到矩形上以便获取到宽高 第一个参数是文字,第二个参数是从0开始绘制 第三个参数是到文字的结束停止绘制, 第四个是矩形 paint.getTextBounds(customText, 0, customText.length(), rect); // 获取到文字的宽度 float textWidth = rect.width(); // 将计算出的宽度告诉给屏幕 width = (int) (getPaddingLeft() + textWidth + getPaddingRight()); } if (heightMode == MeasureSpec.EXACTLY) { // 如果设置的是match_parent height = heightSize; } else { // 设置文字大小 paint.setTextSize(customTextSize); paint.getTextBounds(customText, 0, customText.length(), rect); float textHeight = rect.height(); height = (int) (getPaddingTop() + textHeight + getPaddingBottom()); } setMeasuredDimension(width, height); } @Override protected void onDraw(Canvas canvas) { // 绘制背景色 paint.setColor(Color.YELLOW); // 将背景色绘制到UI界面上 参数分别代表。左上右下的坐标位置, 最后一个是画笔 canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint); // 绘制文字颜色 paint.setColor(customTextColor); /** * 将文字绘制到界面上 * 第一个参数是文字 * 第二个参数是x坐标 * 第三个参数是y坐标 * 第四个参数是画笔 */ canvas.drawText(customText, getWidth() / 2 - rect.width() / 2, getHeight() / 2 + rect.height() / 2, paint); } @Override public void onClick(View v) { customText = getRandom(); invalidate(); } // 获取长度为4的随机数 public String getRandom() { Random random = new Random(); List<Integer> list = new ArrayList<>(); while (list.size() < 8) { int ran = random.nextInt(10); list.add(ran); } StringBuffer buffer = new StringBuffer(); for (Integer in : list) { buffer.append("" + in); } return buffer.toString(); }}
0 0
- 自定义view(一 <文本>)
- 自定义View(1):自定义文本显示
- 自定义View(一)
- 自定义view(一)
- 自定义View(一)
- 自定义View(一)
- 自定义View(一)
- 自定义View(一)
- 自定义view(一)
- 自定义View(一)
- 自定义View(一)
- 自定义View(一)
- 自定义View(一)
- 自定义View(一)
- 自定义View(一)
- 自定义View(一)
- 自定义View(一) 初识自定义view
- Android 自定义View(一)
- 关于Listview、Girdview的setSelection无效的解决方法与解析
- intellij idea14 -打包apk文件和查看sha1值
- 错误:数据库文件连接失败(VS2012)
- BZOJ2431: [HAOI2009]逆序对数列 DP
- [HDU 5728] PowMod (欧拉函数的积性+欧拉公式降幂+欧拉筛)
- 自定义view(一 <文本>)
- ListView嵌套ListView,listVIew中含有各种不同布局的item
- 关于实现输入框动态搜索输入,自动更新listview
- spring的aop原理
- 微信飞机大战
- 【miscellaneous】华为智能视频监控系统设计解决方案
- 福建长乐一中(旅游)酱油记
- go struct 自定义标签获取
- Linux中常用命令