当前位置:   article > 正文

Android:自定义控件

Android:自定义控件

3.16自定义控件

1.自定义VIEW组件

创建CustomizeView,继承View。重写onDraw方法,通过onDraw方法绘制我们自定义的图像、位图、路径等。

示例:

  1. //自定义绘制View
  2. public class CutomizeView extends View {
  3. //构造方法
  4. public CutomizeView(Context context) {
  5. super(context);
  6. }
  7. //构造方法,这个构造必须有
  8. public CutomizeView(Context context, @Nullable AttributeSet attrs) {
  9. super(context, attrs);
  10. }
  11. //重新onDraw方法
  12. @Override
  13. protected void onDraw(Canvas canvas) {
  14. //矩形位置坐标
  15. RectF rectF=new RectF(100,100,400,400);
  16. //画笔
  17. Paint paint=new Paint();
  18. //设置画笔
  19. //设置反锯齿
  20. paint.setAntiAlias(true);
  21. //设置绘制颜色
  22. paint.setColor(0xFF20FF22);
  23. //设置绘制样式
  24. paint.setStyle(Paint.Style.STROKE);
  25. //设置绘制文本大小
  26. paint.setTextSize(100);
  27. //绘制矩形
  28. canvas.drawRect(rectF,paint);
  29. //绘制椭圆
  30. canvas.drawOval(rectF,paint);
  31. //绘制圆
  32. canvas.drawCircle(300,300,200,paint);
  33. //绘制线段
  34. canvas.drawLine(0,0,100,100,paint);
  35. //绘制文本
  36. canvas.drawText("hello",200,900,paint);
  37. //绘制圆弧
  38. canvas.drawArc(rectF,0,100,true,paint);
  39. //绘制点
  40. canvas.drawPoint(800,800,paint);
  41. //绘制图片
  42. //bitmap位图,1、将项目已有图片转为bitmap
  43. Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
  44. canvas.drawBitmap(bitmap,200,1000,paint);
  45. //2.创建一个bitmap
  46. //Bitmap bitmap1=Bitmap.createBitmap(100,100, Bitmap.Config.ARGB_8888);
  47. //绘制路径
  48. drawPath(canvas);
  49. }
  50. //绘制路径
  51. public void drawPath(Canvas canvas){
  52. Paint paint=new Paint();
  53. paint.setColor(0xFF0022FF);
  54. paint.setStyle(Paint.Style.STROKE);
  55. //绘制路径
  56. Path path=new Path();
  57. //起点
  58. path.moveTo(300,400);
  59. //直线
  60. path.lineTo(500,200);
  61. path.lineTo(550,350);
  62. path.lineTo(800,700);
  63. //曲线
  64. path.quadTo(500,300,300,800);
  65. canvas.drawPath(path,paint);
  66. }
  67. }

创建对应layout文件,l_customize1.xml文件

示例:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical" android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <com.example.pro_customizeview.view.CutomizeView
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content">
  8. </com.example.pro_customizeview.view.CutomizeView>
  9. </LinearLayout>

补充:Canvas对象坐标变换方法

translate(100,100):平移变化;

rotate(90):旋转变化;

scale():缩放变化;

save():保存当前坐标系;

restore():销毁当前坐标系,返回上一次坐标系;

自定义属性:

在res/values/attrs.xml中创建我们自定义组件属性。

示例:

定义属性名和属性需要数据格式类型

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <declare-styleable name="CutomizeView">
  4. <attr name="fontColor" format="color"></attr>
  5. <attr name="fontSize" format="dimension"></attr>
  6. </declare-styleable>
  7. </resources>

修改l_customize1.xml文件,设置自定义属性。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:zdy="http://schemas.android.com/apk/res-auto"
  4. android:orientation="vertical"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent">
  7. <com.example.pro_customizeview.view.CutomizeView
  8. zdy:fontSize="20dp"
  9. zdy:fontColor="@color/colorPrimary"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content" />
  12. </LinearLayout>

在自定义组件CutomizeView中构造函数中获取到我们自定义的属性,然后可以在onDraw,onMeasure,onLayout方法中使用。

  1. //构造方法,这个构造必须有
  2. public CutomizeView(Context context, @Nullable AttributeSet attrs) {
  3. super(context, attrs);
  4. //所有的属性存放在AttributeSet中
  5. int count = attrs.getAttributeCount();
  6. //1、遍历获取
  7. for(int i=0;i<count;i++){
  8. //获取属性名
  9. String attrName=attrs.getAttributeName(i);
  10. //获取属性值
  11. String attrValue=attrs.getAttributeValue(i);
  12. }
  13. //2、直接获取到自定义属性
  14. //在R文件中会自动生成
  15. TypedArray typedArray= context.obtainStyledAttributes(attrs,R.styleable.CutomizeView);
  16. //将获取到的属性可以在onDraw,onMesure,onLayout中使用。
  17. int fontColor=typedArray.getColor(R.styleable.CutomizeView_fontColor,0xFF0022FF);
  18. float fontSize=typedArray.getDimension(R.styleable.CutomizeView_fontSize,20);
  19. //注意使用完释放资源
  20. typedArray.recycle();
  21. }

onMeasure方法和onLayout方法。

示例:

  1. //测量方法,获取控件宽高,模式
  2. @Override
  3. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  4. //调用父类onMeasure方法,实际注释掉
  5. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  6. //1、获取mode和size
  7. int widthMode=MeasureSpec.getMode(widthMeasureSpec);
  8. int widthSize=MeasureSpec.getSize(widthMeasureSpec);
  9. int heightMode=MeasureSpec.getMode(heightMeasureSpec);
  10. int heightSize=MeasureSpec.getSize(heightMeasureSpec);
  11. //当父控件为viewgroup时,要获取子控件宽高,必须先测量一次,强制测量
  12. //否则childView的getMeasuredWidth拿不到宽度
  13. measureChildren(widthMeasureSpec,heightMeasureSpec);
  14. //2、通过mode设置合理size
  15. switch (widthMode){
  16. //父控件对子控件限制最大值,wrap_content
  17. case MeasureSpec.AT_MOST:
  18. //宽度设置,
  19. widthSize = 100dp ;
  20. break;
  21. //控件大小是个确定值,100dp,match_parent(父控件大小确定)等
  22. case MeasureSpec.EXACTLY:
  23. break;
  24. //父控件对子控件大小不做限定
  25. case MeasureSpec.UNSPECIFIED:
  26. break;
  27. }
  28. switch (heightMode){
  29. //父控件对控件限制最大值,wrap_content
  30. case MeasureSpec.AT_MOST:
  31. //宽度设置,
  32. break;
  33. //控件大小是个确定值,layout中设置为具体20dp等或者match_parent,父控件大小确定
  34. case MeasureSpec.EXACTLY:
  35. break;
  36. //父控件对控件大小不做限定,例如:ListView中子item数量不定
  37. case MeasureSpec.UNSPECIFIED:
  38. br
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/83737
推荐阅读
相关标签
  

闽ICP备14008679号