糖果派对官方网站_可以赌钱的糖果游戏_手机版
bb电子糖果派对Android之视图

bb电子糖果派对Android之视图

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

在购物平台上,平时能够见到购物车这么的自增自减的控件。

转载自:http://blog.163.com/ppy2790@126/blog/static/103242241201382210910473/
付出自定义控件的步子:
1、精晓View的办事原理
2、 编写世袭自View的子类
3、 为自定义View类扩展属性
4、 绘制控件
5、 响应客户音讯
6 、自定义回调函数
一、View结构原理
Android系统的视图构造的宏图也应用了咬合形式,即View作为具备图形的基类,Viewgroup对View世襲扩大为视图容器类。
View定义了绘图的基本操作
基本操作由多个函数完结:measure(State of Qatar、layout(卡塔尔、draw(State of Qatar,其里面又分别包涵了onMeasure(卡塔尔、onLayout(卡塔尔(قطر‎、onDraw(卡塔尔国四个子方法。具体操作如下:
1、measure操作
measure操作首要用来总计视图的分寸,即视图的增长幅度和长短。在view中定义为final类型,供给子类不能改正。measure(卡塔尔函数中又会调用上面包车型地铁函数:
(1)onMeasure(卡塔尔,视图大小的将要那地最终鲜明,也便是说measure只是对onMeasure的二个封装,子类能够覆写onMeasure(State of Qatar方法达成团结的计量视图大小的艺术,并因而setMeasuredDimension(width, height卡塔尔保存总计结果。

一、简介

  • 怀有的可视化控件都是三番捌回自Android.view.View
  • 创办格局 第一种xml创造,第三种Java代码创造
  • 长度单位 平时写在dimens文件中,通过援用使用
单位 说明
px 屏幕实际像素,如320*480
dp(dip) 屏幕的物理尺寸,大小为1英寸的1/72
sp 与dp类似,根据用户的字体大小首选项进行的缩放
  • 布局共有5种布局
    LinearLayout 线性布局 分为垂直和档期的顺序方向
    RelativeLayout 绝对构造
    TableLayout 表格结构
    FrameLayout 架构 视图能够重叠
    AbsoluteLayout 相对布局 控件通过坐标放置

bb电子糖果派对 1某市镇的购物页面

2、layout操作
layout操效用于安装视图在显示器中显得的岗位。在view中定义为final类型,必要子类不能够改改。layout(State of Qatar函数中有多个基本操作:
(1)setFrame(l,t,r,b),l,t,r,b即子视图在父视图中的具体地点,该函数用于将那些参数保存起来;
(2)onLayout(卡塔尔(قطر‎,在View中那几个函数什么都不会做,提供该函数根本是为viewGroup类型布局子视图用的;

二、布局

  • weight 权重,控件占的份数,假若容器中的控件权重都千篇一律,则象征均分
  • orientation 对于LinearLayout,排列方向,参数vertical和 horizontal
  • margin 控件在容器中相距边的间距
  • visibility 视图可知设置,八个值,visible、invisible、gone(把控件视图间接移除了)
  • gravity 调治呈现情势,居中吗的
  • layout_x、layout_y AbsoluteLayout钦命坐标
  • layout_below、layout_above、layout_toLeftOf、layout_toRightOf RelativeLayout设置
  • padding 控件上下左右偏离

借使大家的花色中也亟需这么的控件,而且在多少个地方供给调用,若是不做分装,大家也许得频仍用LinearLayout结构获取RelativeLayout布局。里面增加相关子控件,各种子控件的点击事件等。那样开采作用相对来讲超低。我们可以经过创造复合控件来化解那样的标题。

3、draw操作
draw操作利用前两部获得的参数,将视图彰显在显示屏上,到这边也就完了了任何的视图绘制专业。子类也不应该改善该措施,因为其里面定义了绘图的基本操作:
(1)绘制背景;
(2)假诺要视图彰显渐变框,这里会做一些备选专业;
(3)绘制视图本身,即调用onDraw(卡塔尔(قطر‎函数。在view中onDraw(卡塔尔国是个空函数,也等于说具体的视图都要覆写该函数来促成自身的展现(比方TextView在那落成了绘图像和文字字的进程)。而对此ViewGroup则无需得以达成该函数,因为作为容器是“未有内容“的,其蕴藉了四个子view,而子View已经达成了友好的绘图方法,由此只要求告诉子view绘制本人就足以了,也正是底下的dispatchDraw(State of Qatar方法;
(4)绘制子视图,即dispatchDraw(卡塔尔国函数。在view中那是个空函数,具体的视图无需落实该措施,它是专程为容器类思量的,约等于容器类必需达成该格局;
(5)假如急需(应用程序调用了setVerticalFadingEdge大概setHorizontalFading艾德ge),开头绘制渐变框;
(6)绘制滚动条;
从地点能够看到自定义View供给最少覆写onMeasure(卡塔尔国和onDraw(卡塔尔(قطر‎多少个点子。

三、View 和ViewGroup

  • Android 的UI 分界面都以由 View 和ViewGroup及其派生类组合而成
  • View是全部UI组件的基类,而ViewGroup是宽容那个构件的器皿。其本身也是从View派生出来的
  • View派生出的一贯子类:
    AnalogClock
    ImageView
    KeyboardView
    ProgressBar
    SurfaceView
    TextView
    ViewGroup
    ViewStub
  • ViewGroup派生出的直白子类:
    AbsoluteLayout
    AdapterView
    FragmentBreadCrumbs
    FrameLayout
    LinearLayout
    RelativeLayout
    SlidingDrawer
  • 静态动态加载构造
    include
    ViewStup

复合控件就是指不可分割的、可采用的视图,那样的视图富含了多个布局和捆绑在联合的子控件。

二、View类的布局方法
创建自定义控件的3种主要完毕方式:
1)世襲已某些控件来达成自定义控件: 首假如当要兑现的控件和已部分控件在非常多方面可比相近, 通过对本来就有控件的恢弘来满足必要。
2)通过三番若干遍贰个布局文件贯彻自定义控件,日常的话做结合控件时得以通过那些主意来促成。
注意那个时候无须onDraw方法,在构造广告中经过inflater加载自定义控件的结构文件,再addView(view卡塔尔(قطر‎,自定义控件的图形分界面就加载进来了。
3)通过连续view类来完毕自定义控件,使用GDI绘制出组件分界面,经常无法通过上述三种方法来贯彻时用该办法。

四、自定义控件

  • View是Android最宗旨的一种UI组件
  • ViewGroup是一种格外的View,能够分包多少个子View和子ViewGroup
  • 具有控件都直接大概间接接轨自View
  • 富有构造都一向或直接接轨自ViewGroup
  • 直接引进构造有三种艺术include和ViewStup
  • 当布局中有照料事件时,就要求自定义控件

复合控件能够巩固大家的工效,方便维护,防止重新造轮子。咱俩来看一下本例子完结的效果与利益

三、自定义View扩展品质的二种格局:
1)在View类中定义。通过布局函数中引进的AttributeSet 去寻找XML布局的天性名称,然后找到它对应引用的财富ID去找值。
案例:完成贰个带文字的图形(图片、文字是onDraw方法重绘达成)

4.1 引进构造

概念三个搭架子title

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn_return"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="return"
        android:layout_weight="1"/>

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Title"
        android:layout_weight="1"/>

    <Button
        android:id="@+id/btn_edit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Edit"
        android:layout_weight="1"/>

</LinearLayout>

引入

  <include layout="@layout/title"/>

bb电子糖果派对 2最终效果上面大家一步一步来达成,这里分成6步。

public class MyView extends View {

4.2 自定义控件

始建叁个世袭View也许View子类的类

public class TitleLayout extends LinearLayout {

    private static final String TAG = "TitleLayout";

    public TitleLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.title, this);

        Button btn_return = findViewById(R.id.btn_return);
        Button btn_edit = findViewById(R.id.btn_edit);
        btn_edit.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d(TAG, "onClick: Edit");
            }
        });

        btn_return.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                ((Activity)getContext()).finish();
            }
        });
    }
}

选择自定义控件

   <com.example.jony.customdemo1.TitleLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

注1:LayoutInflater.from(context).inflate(R.layout.title, this);
因而LayoutInflater的from(卡塔尔国方法创设叁个LayoutInflater对象,该对象调用inflate(卡塔尔国方法动态加载叁个搭架子文件,inflate(卡塔尔方法多个参数,首个构造文件id,第二个参数是给加载好的布局再加多四个父布局
注2: ((Activity)getContext()).finish();
收获各省的上下文,并销毁,此例是直接在activity_main,所以点击就直接销毁主Activity,程序退出

带有自定义属性的自定义控件
自定义

public class CustomView extends View {

    private boolean showtext;
    private int labelPosition;

    public CustomView(Context context) {
        super(context);

    }

    public CustomView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

       TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomView, 0,0);

        try {
            showtext = a.getBoolean(R.styleable.CustomView_showText, false);
            labelPosition = a.getInt(R.styleable.CustomView_labelPosition, 0);
        }finally {
            a.recycle();
        }

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        setBackgroundColor(Color.RED);
        super.onDraw(canvas);
    }
}

在values文件夹下创设attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CustomView">
        <attr name="showText" format="boolean" />
        <attr name="labelPosition" format="enum">
            <enum name="left" value="0"/>
            <enum name="right" value="1"/>
        </attr>
    </declare-styleable>
</resources>

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:custome="http://schemas.android.com/apk/com.example.jony.customdemo1"
    tools:context="com.example.jony.customdemo1.MainActivity">

    <!--使用自定义控件-->
    <com.example.jony.customdemo1.CustomView
        android:layout_width="100dp"
        android:layout_height="20dp"
        custome:showText="true"
        custome:labelPosition="left"/>

</android.support.constraint.ConstraintLayout>

注:xmlns:custome="http://schemas.android.com/apk/com.example.jony.customdemo1"
自定义的命名空间,最终是运用的包名

  1. 创建AddTextView继承View
private String mtext;
private int msrc;

public MyView(Context context) {
    super(context);
}

public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
    int resourceId = 0;
    int textId = attrs.getAttributeResourceValue(null, "Text",0);
    int srcId = attrs.getAttributeResourceValue(null, "Src", 0);
    mtext = context.getResources().getText(textId).toString();
    msrc = srcId;
}

@Override
protected void onDraw(Canvas canvas) {
    Paint paint = new Paint();
    paint.setColor(Color.RED);
    InputStream is = getResources().openRawResource(msrc); 
            Bitmap mBitmap = BitmapFactory.decodeStream(is);
            int bh = mBitmap.getHeight();
            int bw = mBitmap.getWidth();
        canvas.drawBitmap(mBitmap, 0,0, paint);
    //canvas.drawCircle(40, 90, 15, paint);
    canvas.drawText(mtext, bw/2, 30, paint);
}

}
结构文件:

public class AddTextView extends View { Paint mPaint; //画笔 public AddTextView(Context context) { super; } public AddTextView(Context context, AttributeSet attrs){ super(context, attrs); mPaint = new Paint(); //TypedArray是一个用来存放由context.obtainStyledAttributes获得的属性的数组 //在使用完成后,调用recycle方法 //属性的名称是styleable中的名称+“_”+属性名称 TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.AddTextView); int textColor = array.getColor(R.styleable.AddTextView_textColor, 0XFF00FF00); //提供默认值,放置未指定 float textSize = array.getDimension(R.styleable.AddTextView_textSize, 12); mPaint.setColor(textColor); mPaint.setTextSize; array.recycle(); } public void onDraw(Canvas canvas){ super.onDraw; mPaint.setStyle(Paint.Style.FILL); //设置填充 canvas.drawRect(10, 10, 100, 100, mPaint); //绘制矩形 mPaint.setColor(Color.BLUE); canvas.drawText("自定义TextView", 10, 40, mPaint); }}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
bb电子糖果派对,android:orientation="vertical" >

浅析表明:重载布局方法和onDraw方法对于自定义的View若无自个儿特殊的属性,能够直接在xml文件中使用就能够了一旦含有自身特其余性质,那么就要求在布局函数中得到属性文件attrs.xml中自定义属性的称谓并基于供给设定默认值,放在在xml文件中并未有定义。借使应用自定义属性,那么在行使xml文件中须求增添新的schemas,

<com.example.myimageview2.MyView
    android:id="@+id/myView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    Text="@string/hello_world"
    Src="@drawable/xh"/>
xmlns:add="http://schemas.android.com/apk/res/com.peng.addoneview"

</LinearLayout>
个性Text, Src在自定义View类的构造方法中读取。

个中xmlns后的“add”是自定义的质量的前缀,res后的是我们自定义View所在的包

2)通过XML为View注册属性。与Android提供的业内属性写法相通。
案例: 完毕叁个带文字表达的ImageView (ImageView+TextView组合,文字表达,可在布局文件中设置岗位卡塔尔

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