糖果派对官方网站_可以赌钱的糖果游戏_手机版
【bb电子糖果派对】Android开发之自定义View

【bb电子糖果派对】Android开发之自定义View

作者:网络编程    来源:未知    发布时间:2020-03-13 03:20    浏览量:

自定义控件

接纳处境: 在实际支出中经常会遇见现存的UI控件无法满足项目必要,或二个功效涉及到多少个UI控件的构成,或促成某一神效的UI,当时必需通过自定义View的主意,实现这几个功用,比方股票的实时计算图、E-BOOK等。

正文重在对自定义view,以致其常用类,常用方法的初叶询问,提供三个思路,效果是次要,画板只是例证。

1.上边包车型地铁Xfermode子类可以改良这种行为:

分类

1.一而再连续View需求自定义绘制内容,必要后续View,必必要重写onDraw方法,在onDraw方法中来开展绘图,达成onMeasure方法,来衡量控件的长空。

2.继承ViewGroup

  • 经过在ViewGroup中通过this.addView(<控件对象>卡塔尔(قطر‎来增添控件
  • onMeasure方法,来度量控件的空间
  • onLayout方法必需达成,在这里措施中管理子控件的岗位。当视图初步化,或许视图地点爆发转移时候,调用此方法。

由此持续系统现已存在的视图容器,在最初化时候,直接加载结构

mInflater.inflate(<布局资源的ID>,this);mIvBack = (ImageView) findViewById(R.id.btn_back);

通过三番两次系统已经存在的视图大概视图容器,在当中更改此视图或然视图容器的法力比方:通过转移ListView增加删除作用

看效果:
在这之中三个画图板
下边小控件用来展现实时画出的图样
人俗尘小控件用来做一些美术的主宰
2个小控件都能活动

AvoidXfermode  钦赐了三个颜料和容差,免强Paint制止在它上边绘制(只怕只在它上面绘制卡塔尔国。

自定义View步骤

  • 创设类,世袭View及View的子类,并提供相关的结构方法
  • 重写onMeasure(卡塔尔方法,并调用setMeasuredDimension(int width, int height卡塔尔设置控件的分寸
  • 重写onDraw(State of Qatar方法,达成绘制特定内容
  • 重写onTouch伊夫nt(卡塔尔格局管理触摸事件
  • 在构造文件中使用<类全名>并设置属性

bb电子糖果派对 1

PixelXorXfermode  当覆盖已部分颜色时,应用三个简约的像素XORubicon操作。

自定义View属性

1.位置:res/values/attrs.xml

【bb电子糖果派对】Android开发之自定义View。2.属性集

<?xml version="1.0" encoding="utf-8"?><resources> <!-- 声明属性集 --> <declare-styleable name="LabelView"> <attr name="text" format="string"/> <attr name="textSize" format="dimension"/> <attr name="textColor" format="color" /> </declare-styleable></resources>

3.点名属性名及其内容格式例:<attr name="text" format="string" />

string 字符型integer 整数型dimension 尺寸值color 颜色值reference 参谋某一能源IDboolean:布尔值

画图板.jpg

PorterDuffXfermode  那是贰个可怜有力的转变格局,使用它,还行图像合成的16条Porter-Duff准则的自由一条来决定Paint怎么样与原来就有的Canvas图像举行相互作用。

使用自定义View属性

在结构控件标签中引用:xmlns:my="""

在自定义View的View(Context context, AttributeSet attrs卡塔尔布局方法中,获取自定义属性的值

//TypedArray是一个用来存放由context.obtainStyledAttributes获得的属性的数组 //在使用完成后,一定要调用recycle方法 TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.LabelView); CharSequence s = ta.getString(R.styleable.LabelView_text); if (s != null) { setText(s.toString; } setTextColor(ta.getColor(R.styleable.LabelView_textColor, 0xFF000000)); int textSize = ta.getDimensionPixelSize(R.styleable.LabelView_textSize, 0); if (textSize > 0) { setTextSize; } ta.recycle();

附带还也可以有三个刮刮卡功用,只供给改一个参数:

要接纳转变方式,能够采纳setXferMode方法,如下所示:

波及相关类

  • View 动态实例化控件的构造方法
  • View(Context context, AttributeSet attrs卡塔尔 构造中央银行使控件的构造的办法
  • onMeasure(int widthMeasureSpec, int heightMeasureSpec卡塔尔自定义控件时重写的艺术,用于度量控件大小
  • onDraw(Canvas canvas卡塔尔(قطر‎ 在自义控件上制图相关内容
  • onTouchEvent(Motion伊夫nt卡塔尔 落成触摸事件管理方法
  • setPadding(int l,int t,int r,int bState of Qatar 设置内部间隔
  • layout(int l, int t, int r,int b卡塔尔国 更换控件位置的不二等秘书籍
  • requestLayout(卡塔尔 //解除构造,获取新的架构空间(刷新UI,重新调用onDraw
  • invalidate(State of Qatar //重新绘制新的数额(刷新UI,重新调用onDraw
  • int MeasureSpec.getMode 获取控件大小情势
    • MeasureSpec.EXACTLY,确切空间,布局中的属性值日常为match_parent或160dp固定值
    • MeasureSpec.AT_MOST 尽量多的长空,布局中的属性值wrap_content
    • MeasureSpec.UNSPECIFIED 未钦点的,日常在父控件中运用
  • MeasureSpec.getSize 得到控件大小
  • TypeArray Context.obtainStyledAttributes(attrs,普拉多.styleable.LabelView卡塔尔获取内定attrs中的全数属性
  • String getString(R.styleable.LabelView_textState of Qatar 获取钦点属性的文本值
  • int getDimensionPixelSize(R.styleable.LabelView_textSize, 0)获取钦点属性的距离值
  • int getColor(R.styleable.LabelView_textColor, 0xFF000000State of Qatar获取钦命属性的颜色值
  • Paint.setAntiAlias 启用抗锯齿
  • Paint.setTextSize(int pixesState of Qatar 设置字体大小,像素,平时转成sp
  • Paint.setColor(int color卡塔尔国 设置颜色
  • Paint.setStyle(Paint.Style卡塔尔国 设置画笔样式
  • float mTextPaint.measureText 度量文字的大大小小
  • Paint.ascent(卡塔尔(قطر‎ 获取文字基准线以上到文字最上部的区间,负数
  • Paint.descent(卡塔尔 获取文字基准线以下到文字尾巴部分的区间
  • canvas.drawText(String,int x,int y,PaintState of Qatar 绘制文本
  • canvas.drawRoundRect(RectF,int rx,int ry,Paint卡塔尔国 绘制圆角四边方形
  • canvas.drawBitmap(bitmap, left, top, paintState of Qatar 绘制图片
  • canvas.drawCircle(cx, cy, radius, paint) 绘制圆
  • canvas.drawLine(startX, startY, stopX, stopY, paint卡塔尔(قطر‎ 绘制线条

Xfermode有三个子类 :AvoidXfermode 钦定了四个颜色和容差,勉强Paint制止在它上边绘制(可能只在它上面绘制State of Qatar。PixelXorXfermode 当覆盖原来就有的颜色时,应用二个简约的像素异或操作。PorterDuffXfermode 那是一个不胜苍劲的更改情势,使用它,能够应用图像合成的16条Porter-Duff法则的人身自由一条来支配Paint怎么样与已某些Canvas图像举行交互作用。

bb电子糖果派对 2

要使用调换情势,能够使用setXferMode方法,如下所示:

AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID);borderPen.setXfermode;

PorterDuff.Mode为枚举类,一共有15个枚举值:

1.PorterDuff.Mode.CLEA福睿斯所绘制不会付给到画布上。2.PorterDuff.Mode.SRC呈现上层绘制图片3.PorterDuff.Mode.DST展现下层绘制图片4.PorterDuff.Mode.SRC_OVE冠道平常绘制显示,上下层绘制叠盖。5.PorterDuff.Mode.DST_OVE福特Explorer上下层都体现。下层居上突显。6.PorterDuff.Mode.SRC_IN取两层绘制交集。展现上层。7.PorterDuff.Mode.DST_IN取两层绘制交集。呈现下层。8.PorterDuff.Mode.SRC_OUT取上层绘制非交集部分。9.PorterDuff.Mode.DST_OUT取下层绘制非交集部分。10.PorterDuff.Mode.SRC_ATOP取下层非交集部分与上层交集部分11.PorterDuff.Mode.DST_ATOP取上层非交集部分与下层交集部分12.PorterDuff.Mode.XO翼虎异或:去除两图层交集部分13.PorterDuff.Mode.DAOdysseyKEN取两图层全部区域,交集部分颜料加深14.PorterDuff.Mode.LIGHTEN取两图层全体,点亮交集部分颜料15.PorterDuff.Mode.MULTIPLY取两图层交集部分叠合后颜色16.PorterDuff.Mode.SCREEN取两图层全体区域,交集部分改为透明色

bb电子糖果派对 3

AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID);    borderPen.setXfermode(avoid);

刮刮卡.jpg

 

自定义view首先要自定义属性:

在values下边创设attrs.xml:

    <!--画图板-->
    <declare-styleable name="DrawImg">
        <attr name="PaintColor" />            //画笔颜色
        <attr name="PaintWidth" />           // 画笔宽度
        <attr name="CanvasImg" />           //画板图片
    </declare-styleable>

    <!--指定单位-->
    <attr name="PaintColor" format="color" />        
    <attr name="PaintWidth" format="dimension" />          
    <attr name="CanvasImg" format="reference" />          

对此下面3行内定单位的代码能够放出去,能够让几个自定义view 都能采纳。

2.Porter-Duff 效果图:

接下去新建自定义view类世袭view,重写前3个布局方法

红线评释是android studio 3.0.0对此参数提醒的新特点

bb电子糖果派对 4

构造方法.jpg

  • 经过this 让前2个布局方法都达成3个参数的结构方法。
    简短说一下布局方法。一个参数的布局方法是在代码中 new 时用到,2个参数的布局方法在构造xml中用到,3个参数的为主正是自定义view类中选取,大概便是那般。

接下去从attrs.xml中经过TypedArray抽取自定义属性:

        //从attrs文件中取出各个属性
        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.DrawImg, defStyleAttr, 0);
        for (int i = 0; i < a.getIndexCount(); i++) {
            int attr = a.getIndex(i);
            switch (attr) {
                case R.styleable.DrawImg_PaintWidth:        //画笔宽度
                    paintWidth = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(
                            TypedValue.COMPLEX_UNIT_DIP, -1, getResources().getDisplayMetrics()));
                    break;
                case R.styleable.DrawImg_PaintColor:        //画笔颜色
                    paintColor = a.getColor(attr, Color.GREEN);
                    break;
                case R.styleable.DrawImg_CanvasImg:         //画板图片
                    hasCanvasImg = a.getResourceId(attr, -1);
                    break;
            }
        }
        //设置默认画笔宽度
        if (paintWidth == -1) {
            paintWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, context.getResources().getDisplayMetrics());
        }
        //取出bitmap
        if (hasCanvasImg != -1) {
            bitmap = BitmapFactory.decodeResource(getResources(), hasCanvasImg);
        }
        //onMeasure可能走多次,onDraw创建对象更不好 所以把画笔路径new在这里
        path = new Path();
  • 急需暗许值的装置暗中同意值,防止布局中未有用到自定义属性引致报错。

 

下一篇:没有了
友情链接: 网站地图
Copyright © 2015-2019 http://www.tk-web.com. bb电子糖果派对有限公司 版权所有