浅谈自定义view
来源:互联网 发布:手机怎么注册淘宝小号 编辑:程序博客网 时间:2024/06/04 01:01
在工作中会遇到一些安卓系统的控件满足不了业务需求,这样自定义view就可以解决这个问题了。
首选创建个类继承view或者其子类(如果继承imagview就有imageview属性)这样了以view为例子
自定义view类java代码:
重写两个构造方法
public class MyView extends View { //重写他两个构造方法 //这个构造方法用于在java代码创建自定义的view对象 public MyView(Context context) { super(context); //初始画笔 initPaint(); }
//这个构造方法用于在XML代码创建自定义的view对象public MyView(Context context, AttributeSet attrs) { super(context, attrs); //初始画笔 initPaint();
//获取屏幕宽高
//重写onSizeChanged方法里面可以获取系统宽高//定义个变量为系统宽int width;//宽int height;//高@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); width = getResources().getDisplayMetrics().widthPixels; height = getResources().getDisplayMetrics().heightPixels;}
//定义个方法初始化画笔(注意在两个构造方法里面要调用这个方法才可以初始化)
//定义个方法初始化画笔paintPaint paint;public void initPaint() { paint = new Paint(); //设置画笔属性 抗锯齿 paint.setAntiAlias(true); //设置防抖动 paint.setDither(true);}
//在onDraw方法里面绘画
//重写onDraw方法绘制view@Overrideprotected void onDraw(Canvas canvas) { super.onDraw(canvas);
//定义自定义view的特有属性
//定义属性//比如定义这个view最大值和颜色//为java代码设置默认值protected int viewColor = Color.GRAY;protected int max = 100;public int getViewColor() { return viewColor;}public void setViewColor(int viewColor) { this.viewColor = viewColor;}public int getMax() { return max;}public void setMax(int max) { this.max = max;}
//在res里面建个文件夹 (命名自定义的类名+attrs)
<?xml version="1.0" encoding="utf-8"?><!--在这里定义的属性 XML才可以设置自定义属性--><!-- 注意文件命名是自定义view类名+attrs --><!-- declare-styleable 定义名称一般以类名定义 ;attr name指在java定义的属性 ; format指定义的属性是上面类型 --><resources> <declare-styleable name="MyView"> <attr name="max" format="integer" /> <attr name="viewColor" format="color" /> </declare-styleable></resources>
//在构双参造方法里面设置属性
//这个构造方法用于在XML代码创建自定义的view对象public MyView(Context context, AttributeSet attrs) { super(context, attrs); //初始画笔 initPaint(); //XML代码才会执行这个方法 //通过typeArray从attrs里面将xml中设置的属性拿出来 //括号参数(attrs对象可以直接在构造方法参数里面获取,通过R.styleable点命名的名称) TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyView); //括号参数(对应attrs文件里面的名称,默认值) max = ta.getInt(R.styleable.MyView_max, 100); viewColor = ta.getColor(R.styleable.MyView_viewColor, Color.GREEN); //注意自定义属性 最后必须关闭 不然会内存泄露 ta.recycle();//关闭}
//XML引用自定义view和设置自定义属性
xmlns:app="http://schemas.android.com/apk/res-auto"就是导入自定义的--><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.viewdemo.MainActivity"> <!--使用app引用自定义属性--> <com.example.viewdemo.MyView app:viewColor="@android:color/holo_orange_light" android:layout_width="wrap_content" android:layout_height="wrap_content" app:max="50" /></RelativeLayout>
//在mainactivity获取和设置自定义view
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //java代码引用 MyView view = new MyView(this); //在java代码设置自定义属性// view.setMax(88);// view.setViewColor(Color.GRAY); setContentView(view); //引用XML布局 // setContentView(R.layout.activity_main); }}
//这里说下在OnDraw方法里面的基本使用
//重写onDraw方法绘制view@Overrideprotected void onDraw(Canvas canvas) { super.onDraw(canvas); //通过画笔定义绘画的颜色,实体还是空心。。。 //定义画笔颜色 //引用系统颜色 // paint.setColor(Color.RED); //括号参数(透明度,红,绿,蓝)(值都是0-255整数型) // paint.setARGB(0x01, 0x25, 0x11, 0x22); //设置透明度括号参数是0-255整数;注意要先设置颜色再设置透明度,透明度才有效 //paint.setAlpha(22); //设置画笔的宽度(float值) paint.setStrokeWidth(5); //设置渐变setShader //括号(起始点距离X距离,起始距离Y距离,终点距离X距离,终点距离Y距离,起始颜色,终点颜色,模式一般Shader.TileMode.MIRROR) LinearGradient linearGradient = new LinearGradient(0, 0, width, height, Color.GRAY, Color.BLUE, Shader.TileMode.MIRROR); //系统提供linearGradient线性渐变,//径向渐变RadialGradient(颜色由里面向外面变)//角度渐变SweepGradient像雷达样变化以水平右边为启动 //paint.setShader(linearGradient); //设置样式 //为`Style.FILL 填充满`、`Style.FILL_AND_STROKE 填充满有边框`或`Style.STROKE只有边框` paint.setStyle(Paint.Style.STROKE); //通过canvas绘制很多图型 //绘制圆 // 括号参数(水平移动距离(距离Y距离),垂直移动距离(距离X距离),半径,画笔)通过前面两参数确定一个点为圆心 //注意:括号X是负数向左水平移动,Y是负数向上移动;以屏幕左上角为原点 // canvas.drawCircle(50, -10, 30, paint); //括号参数(前面两个距离确定一个点,后面两个距离确定一个点,两个点画个矩形或者正方形) RectF rectf = new RectF(200, 300, 500, 600); //椭圆 // canvas.drawRect(rectf, paint); //同一只画笔可以在画之前定义不同颜色 //引用系统颜色 // paint.setColor(Color.BLUE); //文本 // 括号参数(自定义文本,X平移,Y平移,画笔) paint.setStrokeWidth(1); //设置字体大小 paint.setTextSize(80); //引用自定义颜色属性 paint.setColor(viewColor); //引用自定义int值属性 canvas.drawText(max + "你好", 110, 110, paint); //弧形 // 括号参数(椭圆对象,起始角度,需要画的角度,是否有连线,画笔) //水平为起始角度顺时针为正角度 canvas.drawArc(rectf, -180, 90, true, paint); //线 //括号前面两个确定起始点后面两个确定终点,画笔 // canvas.drawLine(0, 0, width, height, paint); //点 // canvas.drawPoint(110, 10, paint);}
//总结自定义view
创建个类继承view或者其子类;
重写两个构造方法
如果要定义view属性 先定义属性对象,设置set和get方法
在res里面建个attrs文件夹 里面设置定义属性具体类型
再在双参构造方法里面设置属性
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyView);
这样就可以在xml和java代码中使用自定义view
0 0
- 浅谈自定义View
- 浅谈android自定义view
- 浅谈Android自定义View
- 浅谈Android自定义View
- 浅谈自定义view
- 浅谈自定义View之自定义布局FlowLayout
- 浅谈自定义View的宽高获取
- 样式主题与自定义View 浅谈
- 浅谈Android自定义View事件传递机制
- 浅谈自定义View的宽高获取
- 浅谈自定义View的宽高获取
- Android自定义view浅谈(一)setContentView
- 浅谈安卓自定义view(一):制作一个最最最简单的自定义view
- 浅谈android官方文档中自定义view的demo
- Android自定义view浅谈(二) measure layout 和draw
- 浅谈view
- 自定义view
- 自定义View
- Struts2工作原理
- 由两个栈组成的队列
- 技术大牛养成指南,一篇不鸡汤的成功学实践
- 微信小程序开发流程
- live555编译
- 浅谈自定义view
- ffmpeg基本用法
- Java 8 Lambda 表达式
- Kubernetes安装部署学习笔记(二)
- linux c之STDIN_FILENO的作用及与stdin的区别
- 走近华佗,解析自动化故障处理系统背后的秘密
- ListView GridView 相关
- ROS Indigo 进阶笔记 (一) turtlebot 基本仿真操作
- 2017年,身为Android开发的你必须要掌握的热门开源框架