自定义View总结

自定义View总结

package com.bs.gnc.customview;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

/**
 * @author yanglind
 * @date 2019/4/21 0021 13:49
 */
public class MyView extends View {
  public MyView(Context context) {
        super(context);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //平移,旋转,错切,缩放
        //绘制顺序
        canvas.drawText("",0,0,new Paint());
        setTypeface(Typeface typeface)
        //设置字体
        paint.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "Satisfy-Regular.ttf"));
        setFakeBoldText(boolean fakeBoldText)
        //是否使用伪粗体
        setStrikeThruText(boolean strikeThruText)
        //是否加删除线
        setUnderlineText(boolean underlineText)
        //是否加下划线
        setTextSkewX(float skewX)
        //设置文字横向错切角度。其实就是文字倾斜度的啦。

        setTextScaleX(float scaleX)
        //设置文字横向放缩。也就是文字变胖变瘦。

         setLetterSpacing(float letterSpacing)
        //设置字符间距。默认值是 0
         setFontFeatureSettings(String settings)
        //用 CSS 的 font-feature-settings 的方式来设置文字。
        setTextAlign(Paint.Align align)
        //设置文字的对齐方式。一共有三个值:LEFT CETNER 和 RIGHT。默认值为 LEFT。

        setSubpixelText(boolean subpixelText)
        //是否开启次像素级的抗锯齿( sub-pixel anti-aliasing )。
         float getFontSpacing()
        //获取推荐的行距
     

    }
1.让父类去帮助我计算结果
 @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
      //1让父类去帮助我计算结果
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
      //2.通过父类计算以后得到的结果
       int height =  getMeasuredHeight();
       int width = getMeasuredWidth();
       //3.修改为自己想要的尺寸
       int result = width<height?width:height;
       setMeasuredDimension(result,result);
    }
2.完全自己计算view的尺寸
    /**
     *
     * @param widthMeasureSpec 父View对子View的宽度限制
     * @param heightMeasureSpec  父View对子View的高度限制
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        //super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //1.完全自己计算view的尺寸
        //2.保证计算的结果满足父vie的限制
        //3.这个限制是怎么来的?它就是父View把开发者对子View尺寸的要求
        //  进行处理计算之后所得到的更精确的结果
        int measureWidth = 0;//自己的计算结果
        int measureHeight = 0;//自己的计算结果
        //将自己的计算结果和父View对自己的限制进行处理以后得到精确计算结果
        measureWidth = resolveSize(measureWidth,widthMeasureSpec);
        measureHeight = resolveSize(measureHeight,heightMeasureSpec);
        setMeasuredDimension(measureWidth,measureHeight);
    }
}

1.对绘制的内容进行平移,旋转,缩放,等操作时的api调用顺序为Canvas.save() ,Canvas.translate() ,Canvas.restore()
2. getTextBounds: 它测量的是文字的显示范围(关键词:显示)measureText(): 它测量的是文字绘制时所占用的宽度(关键词:占用)导致了 measureText() 比 getTextBounds() 测量出的宽度要大一些
3. 绘制顺序
11.背景
22.主体(onDraw())
33.子 View(dispatchDraw())
44.滑动边缘渐变和滑动条
55.前景
4. 设置文本的对齐方式和换行
41. StaticLayout 的构造方法是 StaticLayout(CharSequence source, TextPaint paint, int width, Layout.Alignment align, float spacingmult, float spacingadd, boolean includepad),其中参数里:width 是文字区域的宽度,文字到达这个宽度后就会自动换行;align 是文字的对齐方向;spacingmult 是行间距的倍数,通常情况下填 1 就好;spacingadd 是行间距的额外增加值,通常情况下填 0 就好; includepad 是指是否在文字上下添加额外的空间,来避免某些过高的字符的绘制出现越界。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值