android自定义view2

如何使用自定义View(流程)?

①自定义View的属性

②继承View(至少重写2个构造方法)

③重写的 onMeasure(测量当前View的尺寸)、onDraw(绘画)、onLayout(定位)、onTouchEvent(监听)方法


使用教程(可以分为2种,一种是不使用自定义的View属性 另一种就是使用自定义的View属性。)

①先说不使用自定义的View(构造方法至少写2个,我这块写了4个)

  1. package com.example.dabin.www.day03_viewcircle;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.os.Build;  
  8. import android.support.annotation.RequiresApi;  
  9. import android.util.AttributeSet;  
  10. import android.view.MotionEvent;  
  11. import android.view.View;  
  12.   
  13. /** 
  14.  * Created by Dabin on 2017/4/27. 
  15.  */  
  16.   
  17. public class VirtualKeyView extends View {  
  18.     public VirtualKeyView(Context context) {  
  19.         super(context);  
  20.     }  
  21.   
  22.     public VirtualKeyView(Context context, AttributeSet attrs) {  
  23.         super(context, attrs);  
  24.     }  
  25.   
  26.     public VirtualKeyView(Context context, AttributeSet attrs, int defStyleAttr) {  
  27.         super(context, attrs, defStyleAttr);  
  28.     }  
  29.   
  30.     @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)  
  31.     public VirtualKeyView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {  
  32.         super(context, attrs, defStyleAttr, defStyleRes);  
  33.     }  
  34.   
  35.     //测量  
  36.     @Override  
  37.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  38.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  39.     }  
  40.   
  41.     //绘制  
  42.     @Override  
  43.     protected void onDraw(Canvas canvas) {  
  44.         super.onDraw(canvas);  
  45.   
  46.        //Paint 为画笔   Canvas为画布    
  47.   
  48.         Paint base = new Paint();       //最底部的圈  
  49.         Paint middle = new Paint();     //中间的圈  
  50.         Paint top = new Paint();        //最顶部的圈  
  51.   
  52.         //选取屏幕中间  
  53.         float wi = canvas.getWidth() / 2;  
  54.         float he = canvas.getHeight() / 2;  
  55.   
  56.         int baseR = dip2px(getContext(), 150); //设置底部圆半径  
  57.         int middleR = dip2px(getContext(), 80); //设置中间圈半径  
  58.         int topR = dip2px(getContext(), 50); //设置圆环宽度  
  59.   
  60.   
  61.   
  62.         base.setARGB(2551993356);  //底部圈设置为红色  
  63.         middle.setColor(Color.WHITE);   //中间部圈设置为白色  
  64.         top.setColor(Color.BLUE);       //顶部圈设置为蓝色  
  65.   
  66.         //画笔样式分三种: 1.Paint.Style.STROKE:描边    2.Paint.Style.FILL_AND_STROKE:描边并填充3.Paint.Style.FILL:填充  
  67.         //base.setStyle(Paint.Style.STROKE);  //给底部圈描边  
  68.   
  69.         //设置描边的粗细,单位:像素px 注意:当setStrokeWidth(0)的时候描边宽度并不为0而是只占一个像素  
  70.         //base.setStrokeWidth(20);   //底部圈描边的粗细  
  71.   
  72.         //设置画笔为抗齿锯  
  73.         base.setAntiAlias(true);  
  74.         middle.setAntiAlias(true);  
  75.         top.setAntiAlias(true);  
  76.   
  77.   
  78.         canvas.drawColor(Color.YELLOW);         //整体页面颜色  
  79.         canvas.drawCircle(wi, he, baseR, base);   //底部圈位置大小  
  80.         canvas.drawCircle(wi, he, middleR, middle);  //中间圈位置大小  
  81.         canvas.drawCircle(wi, he, topR, top);     //顶部圈位置大小  
  82.   
  83.         canvas.drawText("X", wi, he, base);     //底部圈的字体  
  84.     }  
  85.   
  86.     //定位  
  87.     @Override  
  88.     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {  
  89.         super.onLayout(changed, left, top, right, bottom);  
  90.     }  
  91.   
  92.     //监听  
  93.     @Override  
  94.     public boolean onTouchEvent(MotionEvent event) {  
  95.         return super.onTouchEvent(event);  
  96.     }  
  97.   
  98.     //根据手机的分辨率从 dp 的单位 转成为 px(像素)  
  99.     public static int dip2px(Context context, float dpValue) {  
  100.         final float scale = context.getResources().getDisplayMetrics().density;  
  101.         return (int) (dpValue * scale + 0.5f);  
  102.     }  
  103.   
  104. }  

我这块直接在onDraw中进行一系列操作,Paint()为画笔, Canvas为画布,其中根据手机分辨率从dp单位转成为px,可以不用,在相应的位置上直接写上数也可以。

其中drawCircle为画圆、drawLine绘制直线、drawRect绘制矩形、drawBitmap绘制位图

效果如下:



②使用View的属性(点击改变数字)

先在res/values下添加一个attrs.xml,在里面定义属性和声明样式

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <attr name="mText" format="string" />  
  4.     <attr name="mTextColor" format="color" />  
  5.     <attr name="mTextSize" format="dimension" />  
  6.     <declare-styleable name="MyView">  
  7.         <attr name="mText"/>  
  8.         <attr name="mTextColor"/>  
  9.         <attr name="mTextSize"/>  
  10.     </declare-styleable>  
  11. </resources>  

接着在我们的布局文件中声明我们的自定义View

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     xmlns:dabin="http://schemas.android.com/apk/res-auto"  
  5.     android:id="@+id/activity_main"  
  6.     android:layout_width="match_parent"  
  7.     android:layout_height="match_parent"  
  8.     android:paddingBottom="@dimen/activity_vertical_margin"  
  9.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  10.     android:paddingRight="@dimen/activity_horizontal_margin"  
  11.     android:paddingTop="@dimen/activity_vertical_margin"  
  12.     tools:context="com.dabin.com.www.view.MainActivity">  
  13.   
  14.     <com.example.dabin.www.day04_view.MyView  
  15.         android:layout_width="200dip"  
  16.         android:layout_height="100dip"  
  17.         android:textSize="20sp"  
  18.         dabin:mTextSize="25sp"  
  19.         dabin:mText="i love you"  
  20.         dabin:mTextColor ="#0000ff"  
  21.         android:background="#ff0000"/>  
  22.   
  23. </RelativeLayout>  
紧记一定要引入   xmlns:dabin="http://schemas.andoroid.com/apk/res-auto" 这句话,这是命名空间,dabin:mTextSize=”25sp“  这是对我们attrs.xml中声明属性的赋值。

接着看一下自定义View中的内容

  1. package com.example.dabin.www.day04_view;  
  2.   
  3. import android.content.Context;  
  4. import android.content.res.TypedArray;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Color;  
  7. import android.graphics.Paint;  
  8. import android.graphics.Rect;  
  9. import android.util.AttributeSet;  
  10. import android.view.MotionEvent;  
  11. import android.view.View;  
  12.   
  13. /**  
  14.  * Created by Dabin on 2017/9/28.  
  15.  */  
  16.   
  17. public class MyView extends View {  
  18.   
  19.   
  20.     private String mText;// 文字  
  21.     private int mTextColor;// 颜色  
  22.     private int mTextSize; // 字体大小  
  23.   
  24.     private Rect rect;  
  25.     private Paint paint;  
  26.   
  27.     public MyView(Context context) {  
  28.         this(context, null);  
  29.     }  
  30.   
  31.     public MyView(Context context, AttributeSet attrs) {  
  32.         this(context, attrs, 0);  
  33.     }  
  34.   
  35.     public MyView(Context context, AttributeSet attrs, int defStyleAttr) {  
  36.         super(context, attrs, defStyleAttr);  
  37.   
  38.         //获取自定义属性的值  
  39.         TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyView, defStyleAttr, 0);  
  40.   
  41.         mText = a.getString(R.styleable.MyView_mText); //获取attrs.xml中的字体  
  42.         mTextColor = a.getColor(R.styleable.MyView_mTextColor, Color.BLACK);//设置attrs.xml中的字体颜色  
  43.         mTextSize = (int) a.getDimension(R.styleable.MyView_mTextSize, 100);//设置attrs.xml中的字体大小  
  44.   
  45.         a.recycle();  //注意回收  
  46.   
  47.         paint = new Paint();  
  48.         paint.setTextSize(mTextSize); //设置字体大小  
  49.         paint.setColor(mTextColor);  //设置字体颜色  
  50.   
  51.         //获得绘制文本的宽和高  
  52.         rect = new Rect();  
  53.         paint.getTextBounds(mText, 0, mText.length(), rect);  
  54.     }  
  55.   
  56.     // 绘制  
  57.     @Override  
  58.     protected void onDraw(Canvas canvas) {  
  59.         canvas.drawText(mText, getWidth() / 2 - rect.width() / 2, getHeight() / 2 + rect.height() / 2, paint); //绘制文字  
  60.     }  
  61.   
  62.     //监听  
  63.     @Override  
  64.     public boolean onTouchEvent(MotionEvent event) {  
  65.         switch (event.getAction()) {  
  66.             case MotionEvent.ACTION_MOVE:  //移动  
  67.                 break;  
  68.             case MotionEvent.ACTION_DOWN:  //按下  
  69.                 float a = (float) (Math.random() * 10000);  //生成一个随机数  
  70.                 mText = "" + a;  
  71.                 invalidate(); //更新视图  
  72.                 break;  
  73.             case MotionEvent.ACTION_UP:  //抬起  
  74.                 break;  
  75.         }  
  76.         //这句话不要修改  
  77.         return super.onTouchEvent(event);  
  78.     }  
  79. }  
在构造方法中,获取自定义View的对象,然后对其进行赋值。

在onTouchEvent()监听方法中设置点击改变值。

效果如下:


这些就是自定义View的一些简单使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值