Android 自定义View大全,Android中自定义View的实现方式总结大全
Android自定义view是什么
在我们的日常开发中,很多时候系统提供的view是无法满足我们的需求的,例如,我们想给一个edittext加上清除按钮,等等。
这时候我们就需要对系统的view进行扩展或者组合,这就是所谓的自定义view。
Android自定义view的种类
自定义view大概可以分为四个大类,主要是通过实现方式来区分
1.自绘控件,继承view,重写onDraw方法,在其中进行绘制,需要自己适配边距等等
2.继承ViewGroup派生的特殊Layout,主要用于实现自定义布局,也需要自己适配边距等
3.继承特定的View(如TextView等),不用自己适配支持wrap_conten,match_parent,可以给其加入新的功能
4.继承特定的ViewGroup,例如linearlayout,多用于多个控件的组合view,也不用自己去做适配
自绘控件
这种自定义view是最复杂的一种,因为既要适配wrap_conten,match_parent又要通过条件判断来在屏幕上绘制不同的内容,主要就是重写onDraw方法
以下是一个简单的onDraw重写代码
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
final int paddingLeft = getPaddingLeft();
final int paddingRight = getPaddingRight();
final int paddingTop = getPaddingTop();
final int paddingBottom = getPaddingBottom();
//get the view's width and height and decide the radiu
int width = getWidth() - paddingLeft - paddingRight;
int height = getHeight() - paddingTop - paddingBottom;
radiu = Math.min(width , height) / 2 - boundWidth - progressWidth;
//setup the paint
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(boundWidth);
paint.setColor(Color.BLACK);
//draw the inner circle
int centerX = paddingLeft + getWidth()/2;
int centerY = paddingTop + getHeight() / 2;
canvas.drawCircle(centerX,centerY, radiu, paint);
float totalRadiu = radiu +boundWidth +progressWidth/2;
//draw the circlr pic
if (drawable != null&&bitmap == null) {
image = ((BitmapDrawable) drawable).getBitmap();
bitmap = Bitmap.createBitmap((int)(2*totalRadiu),(int)(2*totalRadiu), Bitmap.Config.ARGB_8888);
Canvas bitmapCanvas = new Canvas(bitmap);
Paint bitmapPaint = new Paint();
bitmapPaint.setAntiAlias(true);
bitmapCanvas.drawCircle(totalRadiu, totalRadiu, radiu, bitmapPaint);
bitmapPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
bitmapCanvas.drawBitmap(image,null,new RectF(0,0,2*totalRadiu,2*totalRadiu) , bitmapPaint);
}
Rect rect = new Rect((int)(centerX -totalRadiu),(int)(centerY-totalRadiu),(int)(centerX+totalRadiu),(int)(centerY+ totalRadiu));
canvas.save();
if(isRotate)
canvas.rotate(rotateDegree,centerX,centerY);
canvas.drawBitmap(bitmap,null ,rect, paint);
canvas.restore();
//set paint for arc
paint.setStrokeWidth(progressWidth);
paint.setStrokeCap(Paint.Cap.ROUND);
//prepare for draw arc
RectF oval = new RectF();
oval.left = centerX -totalRadiu ;
oval.top =centerY- totalRadiu ;
oval.right = centerX + totalRadiu;
oval.bottom = centerY+ totalRadiu;
paint.setColor(progressBackColor);
//draw background arc
canvas.drawArc(oval, arcStar, arcEnd, false, paint);
//draw progress arc
paint.setColor(progressColor);
canvas.drawArc(oval, arcStar, progress, false, paint);
}
关于这个例子的完整版本,请查看另外一篇文章点击这里
继承ViewGroup派生的特殊Layout
主要是通过在方法中加载特定的布局,在对其内部的各个view的行为进行指定来实现。
继承特定的View(如TextView等)
可以增加特定view对特定事件的响应
继承指定ViewGroup的view
也是通过加载特定布局,再在其中处理view的行为来实现,大部分继承ViewGroup的自定义view都可以用此方法实现,不过viewgroup的方式更接近底层。
一个简单的例子
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.imagebtn, this);
imageView=(ImageView) findViewById(R.id.imageView1);
textView=(TextView)findViewById(R.id.textView1);
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对各位Android开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
Android 自定义View大全,Android中自定义View的实现方式总结大全相关推荐
- vue自定义html模板,vue中自定义html文件的模板
如果默认生成的 HTML 文件不适合需求,可以创建/使用自定义模板. 一是通过 inject 选项,然后传递给定制的 HTML 文件.html-webpack-plugin 将会自动注入所有需要的 C ...
- dio设置自定义post请求_flutter中dio的post请求方式使用总结
题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. 重要消息 1 引言 dio用来在flutter跨平台开发中访问网络的框架,在使用的时候,我们首先是引入依赖 depen ...
- android tablelayout 多行,android – 自定义TableLayout,行中有多个TextView
我想用这样的行来创建自定义TableLayout: 电视用于TextView,即我想在行中添加11个TextView: 每行以标题开头,然后我添加5对TextView,这样表格行就像屏幕一样宽. 这是 ...
- 怎么将vue模板转换为html,vue中自定义html文件的模板
如果默认生成的 HTML 文件不适合需求,可以创建/使用自定义模板. 一是通过 inject 选项,然后传递给定制的 HTML 文件.html-webpack-plugin 将会自动注入所有需要的 C ...
- android activity 回调函数,Android Activity的生命周期
Activity的生命周期 Android系统根据activity的所处不同阶段对应的唤起其特定的回调函数来执行代码.activity的一系列有序的生命周期回调函数.本文将来讨论下activity各阶 ...
- android 获取当前画布,Android硬件位图填坑之获取硬件画布
前言 Hardware Bitmap(硬件位图)是Android8.0加入的新功能,通过设置Bitmap的config为Bitmap.Config.HARDWARE,创建所谓的Hardware Bit ...
- NHibernate自定义集合类型(上):基本实现方式
前天一篇文章中我说NHibernate的集合类型实现有些"尴尬",它无法使用自定义集合类型,设计也有些古怪--不过在许多朋友的指点下,我意识到NHibernate是可以使用自定义集 ...
- android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...
转载:http://blog.csdn.net/xiabing082/article/details/48781489 1. 大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...
- android sqlite自定义函数,Android中自定义一个View的方法详解
本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...
最新文章
- SpringCloud + Consul服务注册中心 + gateway网关
- 某程序员遭遇奇葩事:辞退自己的leader竟然命令自己回前公司,给前同事讲代码!...
- 雅克比迭代法求方程组的解(Python实现)
- mac怎么合并两个容器_PDF怎样合并?在Mac上合并PDF文件的最佳方法
- [CCF] 201612-2 工资计算
- 【ARM】Tiny4412裸板编程之LED(C语言)
- 台湾邮政历史常设展重新开幕
- 昨晚三巨头聚餐,顺便聊了这三个问题
- oracle出错如何备份数据,Oracle数据库备份失败, 出错代码:0xe0001402
- 黑苹果hidp显示不清楚_魔兽世界9.0:盟约指挥台不显示胜率?搞清楚机制,轻松收菜!...
- 怎样修改word页面页码
- 鲁大师2023年Q1手机报告:ColorOS蝉联榜首
- 用u盘制作u启动重装系统的步骤实现
- 人工智能全栈学习路线之人工智能概览(百度云智学院学习笔记)
- subscript on non-array or too many dimensions
- OA系统资产管理借力工作流,覆盖从采购申请-报废的全过程
- Windows10 运行 WSA
- mysql数据库取证_1earn/取证.md at master · doanhnhq-uit/1earn · GitHub
- bzoj 4244: 邮戳拉力赛 动态规划
- DSP 调试自定义变参打印函数
热门文章
- selinux权限调试
- OAuth及OIDC技术分享PPT杂记
- 数据错误循环冗余检查是什么意思_“DCS系统组态”是什么意思?其步骤方法又有哪些?...
- Linux常见的练习题
- 缩短NC6服务启动的时间
- 人像抠图,不用PS,帮你傻瓜式抠图,亲测好用
- 魔术方法★★★★★★
- JQuery遍历数组的方法
- java对JSON字符串差异化对比
- jbpm用户手册-Chapter 9. Process Modelling---90%