自定义View(一)
来源:互联网 发布:达芬奇家具 知乎 编辑:程序博客网 时间:2024/06/06 00:56
在view中通常有一下一些比较重要的回调方法:
onFinishInflate(): 加载完xml文件回调
onSizeChanged():组件大小发生改变时回调
onMeasure():回调该方法来进行测量
onLayout():回调该方法来确定显示位置
onTouchEvent():监听到触摸事件时回调
在自定义view时不必重写所有回调,只需要重写特定的方法即可。
通常情况下有以下三种方法来实现自定义的空间。
1.对现有的进行拓展
2.通过组合来实现新的控件
3.重写view来实现全新的控件
首先了解对现有控件的拓展。
实现下面的效果
继承Texview
public class MyTextView extends TextView { private Paint mPaint1; private Paint mPaint2; public MyTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub init(); } private void init() { mPaint1 = new Paint(); mPaint1.setColor(getResources().getColor( android.R.color.holo_blue_light)); mPaint1.setStyle(Paint.Style.FILL); mPaint2 = new Paint(); mPaint2.setColor(Color.YELLOW); mPaint2.setStyle(Paint.Style.FILL); } public MyTextView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub init(); } public MyTextView(Context context) { super(context); // TODO Auto-generated constructor stub init(); } @Override protected void onDraw(Canvas canvas) { // 绘制外层矩形 canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint1); // 绘制内层矩形 canvas.drawRect(10, 10, getMeasuredWidth() - 10, getMeasuredHeight() - 10, mPaint2); canvas.save(); canvas.translate(10, 0); super.onDraw(canvas); canvas.restore(); }}
实现下面效果,渐变色
可以利用Paint的Shader渲染器,通过设置不断变化的LinearGradient,使用带有该属性的paint来绘制。
首先在OnSizeChanged()方法中进行一些对象的初始化操作。
/** * 渐变效果的textview * * @author Administrator * */public class MyTextView2 extends TextView { private int mViewWidth = 0; private float mTranslate; private TextPaint mPaint; private LinearGradient mGradient; private Matrix mGradientMatrix; public MyTextView2(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public MyTextView2(Context context, AttributeSet attrs) { super(context, attrs); } public MyTextView2(Context context) { super(context); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); if (mViewWidth == 0) { mViewWidth = getMeasuredWidth(); if (mViewWidth > 0) { mPaint = getPaint(); // 第一个,第二个参数表示渐变起点 可以设置起点终点在对角等任意位置 // 第三个,第四个参数表示渐变终点 // 第五个参数表示渐变颜色 // 第六个参数可以为空,表示坐标,值为0-1 new float[] {0.25f, 0.5f, 0.75f, 1 } // 如果这是空的,颜色均匀分布,沿梯度线。 // 第七个表示平铺方式 // CLAMP重复最后一个颜色至最后 // MIRROR重复着色的图像水平或垂直方向已镜像方式填充会有翻转效果 // REPEAT重复着色的图像水平或垂直方向 mGradient = new LinearGradient(0, 0, mViewWidth, 0, new int[] { Color.BLUE, 0xffffffff, Color.BLUE }, null, Shader.TileMode.CLAMP); mPaint.setShader(mGradient); mGradientMatrix = new Matrix(); } } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mGradientMatrix != null) { mTranslate += mViewWidth / 5; if (mTranslate > 2 * mViewWidth) { mTranslate = -mViewWidth; } // 通过矩阵的方式来不断平移渐变效果 mGradientMatrix.setTranslate(mTranslate, 0); mGradient.setLocalMatrix(mGradientMatrix); postInvalidateDelayed(100); } }}
0 0
- Android自定义View(一)
- Android 自定义View (一)
- Android 自定义View (一)
- Android自定义View(一)
- Android 自定义View (一)
- Android 自定义View(一)
- Android 自定义View (一)
- Android 自定义View (一)
- Android 自定义View (一)
- 自定义view总结一
- Android自定义View(一)
- Android 自定义View (一)
- Android 自定义View (一)
- Android 自定义View (一)
- Android 自定义View (一)
- Android 自定义View (一)
- Android 自定义View (一)
- 自定义View(一)
- 《C和指针》读书笔记(二)
- python爬虫学习--pixiv爬虫(1)--p站爬虫的登录
- [知其然不知其所以然-20] pci resource allocation
- Servlet复习
- MyEclipse+Tomcat+MAVEN+SVN项目完整环境搭建
- 自定义View(一)
- C语言函数-笔记-2016-3-28
- 同一个div中图标与块元素没对齐
- 68.KVC/KVO原理详解及编程指南
- 设备像素比devicePixelRatio简单介绍
- XZ压缩最新压缩率之王
- SharePoint2013 IT Professional - Library/List Filter
- 自定义tabbar
- Ubuntu 14.04安装Sublime Text 2并配置python环境