2019-03-05 22:05:04 Android_xi 阅读数 28
  • 高焕堂讲解EIT造形(Part-2:应用篇)

    这是高老师的演讲视频,亲自讲解其EIT设计模式(造形)的应用情境。基于EIT造形,不仅人们容易从简单中组合出复杂;此外,组合出来的复杂系统,却是稳定而能有机成长的。除了促进互联互通的效益之外,又包容过去、现在和未来的通信协议,保护了过去的投资,并大幅提升顶层设计的未来性。

    5399 人正在学习 去看看 高煥堂

1.基本控件介绍

Android的SDK中定义了一个View类,它是所有Android控件和容器

的父类。《View和ViewGroup》。

View和ViewGroup的概念

View:Android中所有控件的顶层基类

ViewGroup:是View的子类,代表一个View的容器,可以用于存放

其他View对象

布局类(就是ViewGroup类的子类)

不同的布局管理内部空间的方式不一样

线性布局(LinearLayout):是按照线性排列(横向、纵向)的

方式对内部控件的位置进行管理

常用属性:android:orientation=“vertical”[ horizontal]

2.View类的常用属性:


android:id 设置控件的标识符号
android:layout_width 设置子组件的布局宽度

android:layout_height 设置子组件的布局度

android:background 设置控件的背景色

android:onClick 设置控件的单击事件绑定监听器

android:visibility 设置控件是否可见

(invisible/visible/gone<不可见,不占位>

tv_name.setVisibility(View.VISIBLE);)

android:alpha 设置控件透明度(0-1之间的数值)

android:padding 设置子组件的内边距

android:layout_margin 设置子组件的外边距

android:onClick 为控件设置点击事件对应的回调方法

android:layout_width

android:layout_height

属性值:
1)具体的长度
2)wap_content, 包裹内容(根据内容的大小调整控件的大小)
3)fill_parent:填充父控件(从Android2.1开始被match_parent

替代)4)match_parent:填充父控件

PS:以上两个属性是任何一个控件都必须要设置的,并且长度单

位推荐使用:dp常用的基本控件

3.TextView

TextView:基本文本标签,用于展示一个简单文本

常用属性:

android:text:文本的内容
android:textSize:文字的大小
android:textColor:文本的颜色《#RGB

#ARGB

#RRGGBB

#AARRGGBB
android:textColor="@android:color/holo_green_light"

android:gravity:控制控件内容的位置

android:drawableXXX:在控件中放置图片

android:autoLink:设置超链接

需要了解的属性:

android:shadowDx -------阴影的横坐标偏移

android:shadowDy------- 阴影的纵坐标偏移

android:shadowRadius-------- 阴影的半径

android:shadowColor--------- 阴影的颜色

android:textAllCaps-------所有字母大写

android:password ------------将文字设置为密文

代码操作法:

//在代码中修改TextView的文本内容

//根据id在当前的页面中寻找控件
tv_name = (TextView)this.findViewById(R.id.tv_name);

//设置文本的内容,大多数情况下,一个控件在布局中设置的属

性都有对应的方法可以在代码中去设置
tv_name.setText(“修改了,文件的文本!”);

//

              tv_name.setTextColor(Color.BLUE);       

                  tv_name.setTextColor

(Color.parseColor("#FF0000"));

          tv_name.setTextSize(30);

使用TextView实现跑马灯效果
需要
设置以下属性:
android:singleLine=“true”

android:ellipsize=“marquee” //跑马灯效果

android:focusable=“true”//让控件可获取焦点

android:focusableInTouchMode=“true” // 让控件在触摸模式下

获取焦点

可选的属性:android:marqueeRepeatLimit //文本滚动的次数

属性值:-1或marquee_forever,代表无限滚动

具体的滚动次数(比如设置为2)

使用跑马灯的前提:
1)文本内容必须要超出控件的宽度
2)必须单行显示

android:singleLine=“true”

android:maxEms=“8”

android:ellipsize=“end”

android:singleLine=“true”

android:ellipsize=“end”

android:ems=“15”

设置TextView的行间距、行高。

1、android:lineSpacingExtra?
设置行间距,如”8dp”
2、android:lineSpacingMultiplier?
设置行间距的倍数,

如”1.5″

设置每行的最大字数

maxLength和固定15个字的宽度或代码控制加\n

android:singleLine=“false”.

android:maxEms

setText(Html.fromHtml()

关于文本颜色的操作代码设置:

private void setText(TextView t){
String text =t.getText().toString().trim();

SpannableStringspan = new SpannableString(text);

span.setSpan(new ForegroundColorSpan(Color.WHITE), 0,

1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

t.setText(span);

}

tv_lingqu_tishi.setTextColor(Color.parseColor

("#ffffff"));

Button 按钮

继承自TextView,具有TextView的所有属性

注册监听事件的四种方式:

1、 设置 android:onClick 属性

《android:onClick=“onBtnClick”

// 当按钮被点击的时候调用的方法
publicvoid onBtnClick(View v) {

System.out.println("使用onClick属性");

Toast.makeText(MainActivity.this,“使用onClick属性”,

1).show();

}

2、 成员内部类

《//方式二:使用成员内部类

privateclass MyListener implements OnClickListener{

  @Override
  publicvoid onClick(View v) {

   
     //TODO Auto-generated method stub

System.out.println(“方式二:使用成员内部类”);

Toast.makeText(MainActivity.this,"方式二:使用成员内部

类", 1).show();
}
}

button2.setOnClickListener(newMyListener());

3、 匿名内部类
//方式三:使用匿名内部类

button3= (Button) this.findViewById(R.id.button3);

button3.setOnClickListener(newView.OnClickListener() {

@Override

publicvoid onClick(View v){

System.out.println(“方式三:使用匿名内部类”);

Toast.makeText(MainActivity.this,"方式三:使用匿名内部

类", 1).show();
}

});

4、 当前Activity实现监听接口(OnClickListener)

《public class MainActivity extends Activity

implementsOnClickListener {

     //方式四:实现监听接口

  @Override 
  publicvoid onClick(View v) {
      //TODO Auto-generated method stub


      switch(v.getId()) {
      caseR.id.button4:

System.out.println(“方式四:实现监听接口1”);

         Toast.makeText(MainActivity.this,"方式四:实

现监听接口1", 1).show();
break;
caseR.id.button5:
System.out.println(“方式四:实现监听接口2”);

         Toast.makeText(MainActivity.this,"方式四:实

现监听接口2", 1).show();

              break;

default:

          break;

}

}

}》

EditText 文本编辑框
【ems

–EditText类继承自TextView类,具有TextView的所有属性

–EditText与TextView最大的不同就是用户可以对EditText控

件进行编辑,同时还可以为EditText控件设置监听器,用来判断

用户的输入是否合法

android:hint 输入提示

android:textColorHint 提示的颜色

android:textColorHighlight 选中字体的背景颜色

android:inputType 输入类型的可选项

监听输入框中文本内容的变化:
addTextChangedListener(TextWatcher watcher)

《//监听EditText中文本变化

name.addTextChangedListener(newMyWather());

//监听EditText中文本变化

classMyWather implements TextWatcher{
@Override

            publicvoid onTextChanged

(CharSequence s, int start, int ,before,int count) {

   //TODO Auto-generated method stub                  

System.out.println(“文本发生改变…”+s);

}

}

if(TextUtils.isEmpty(namea) || TextUtils.isEmpty(pwd))

Android的四大组件
Activity 与用户交互的界面

Service 后台服务

BroadcastReceiver 广播接收器

ContentProvider 内容提供者(可以通过该组件实现不同进程间

的数据交互)

ImageView 图形视图

继承自View

andorid:src 设置图片来源

android:adjustViewBounds 用于设置ImageView 是否调整自己的

边界,来保持所显示图片的长宽比例

android:maxHeight 设置 ImageView 的最大高度

《需要先设置android:adjustViewBounds为true,否则不起作用

andorid:maxWidth 设置 ImageView 的最大宽度

android:scaleType 设置所显示的图片如何缩放或移动,以适应

ImageView的大小

setImageBitmap() 设置Bitmap作为图片源

setImageDrawable() 设置Drawable作为图片源

setImageResource() 设置Resource作为图片源

//方式一:Drawable类描述的是资源文件中的图像资源

//Drawabledrawable = getResources().getDrawable

(R.drawable.hjgh_n);

//iv.setImageDrawable(drawable);

//方式二:在Android中是用Bitmap类来描述图片

//通过BitmapFactory(位图工厂)生成Bitmap对象

/* Bitmap bm = BitmapFactory.decodeResource(getResources

(),R.drawable.hjgh_n);

iv.setImageBitmap(bm);*/

//方式三:

iv.setImageResource(R.drawable.hjgh_n);

获取资源文件实现切换效果:

private int[] imgs =

{R.drawable.lz1,R.drawable.lz2,R.drawable.lz3};

int index = 0;

public void xiaClick(View v){

if(index ==(imgs.length-1)){

     index=0;

   }else{

                        


      index++;

}

imView.setImageResource(imgs[index]);
}

怎么在代码中设ImageView的src属性

setImageDrawable(drawable);

setImageBitmap(bm);

setImageResource(resId);

怎么在代码中设ImageView的background属性

setBackgroundResource(R.drawable.down_finish);

// iv_startguid.setImageDrawable(getResources

().getDrawable(R.drawable.btn_start_guide));

iv_startguid.setBackgroundResource

(R.drawable.btn_start_guide);

2019-04-12 15:14:00 qq_39485117 阅读数 77
  • 高焕堂讲解EIT造形(Part-2:应用篇)

    这是高老师的演讲视频,亲自讲解其EIT设计模式(造形)的应用情境。基于EIT造形,不仅人们容易从简单中组合出复杂;此外,组合出来的复杂系统,却是稳定而能有机成长的。除了促进互联互通的效益之外,又包容过去、现在和未来的通信协议,保护了过去的投资,并大幅提升顶层设计的未来性。

    5399 人正在学习 去看看 高煥堂

**

基本控件

控件名称 作用描述
View Android中所有控件的顶层基类
TextView 显示文字,相当于Panel
ImageView 显示图片
EditText 输入框,可编译,可设置软键盘方式
Button 按钮,可附带图片
CheckBox 复选框
RadioButton 单选按钮(和RadioGroup配合使用)

**

View类的常用属性

属性名称 作用描述
android:id 设置控件的标识符号
android:layout_width 设置子组件的布局宽度
android:layout_height 设置子组件的布局高度
android:background 设置控件的背景色
android:onClick 设置控件的单击事件绑定监听器
android:padding 设置子组件的内边距
android:layout_margin 设置子组件的外边距

android:layout_width、android:layout_height
属性值:1)具体的长度
2)wap_content,包裹内容(根据内容的大小调整控件的大小)
3)fill_parent:填充父控件(从Android2.1开始被match_parent替代)
4)match_parent:填充父控件

TextView简介

属性名称 作用描述
android:id 设置控件的标识符号
android:layout_width 设置子组件的布局宽度
android:layout_height 设置子组件的布局高度
android:background 设置控件的背景色
android:text 设置文本的内容
android:textSize 设置文字的大小
android:textColor 设置文本的颜色
android:gravity 控制控件内容的位置
android:textAlignment 设置文字的对齐方式

在这里插入图片描述
使用TextView实现跑马灯效果
需要设置以下属性:

1)android:singleLine=“true”
2) android:elipsize=“marquee” //跑马灯效果
3)android:focusable=“true” //让控件可获取焦点
4) android:focusableInTouchMode=“true” //让控件在触摸模式下获取焦点
5)可选的属性:
android:marqueeRepeatLimit //文本滚动的次数
使用跑马灯的前提:
1)文本内容必须要超出控件的宽度
2)必须单行显示

button简介

–继承自TextView,具有TextView的所有属性

属性名称 作用描述
android:id 设置控件的标识符号
android:layout_width 设置子组件的布局宽度
android:layout_height 设置子组件的布局高度
android:background 设置控件的背景色
android:text 设置文本的内容
android:textSize 设置文字的大小
android:textColor 设置文本的颜色
android:gravity 控制控件内容的位置
android:textAlignment 设置文字的对齐方式

在这里插入图片描述
效果如下:
在这里插入图片描述
注册监听事件的四种方式:
1.设置android:onClick属性
2.成员内部类
3.匿名内部类
4.当前Activity实现监听接口

EditText简介

–EditText类继承自TextView,具有TextView的所有属性
–EditText与TextView最大的不同就是用户可以对EditText控件进行编辑,同时还可以为EditText控件设置监听器,用来判断用户的输入是否合法

属性名称 作用描述
android:id 设置控件的标识符号
android:layout_width 设置子组件的布局宽度
android:layout_height 设置子组件的布局高度
android:background 设置控件的背景色
android:hint 输入提示
android:text 设置文本的内容
android:textSize 设置文字的大小
android:textColor 设置文本的颜色
android:gravity 控制控件内容的位置
android:textAlignment 设置文字的对齐方式

在这里插入图片描述

CheckBox简介

CheckBox继承于Button,所以具有普通按钮的各种属性,但是与普通按钮不同的是,CheckBox提供了可选中的功能。

属性名称 作用描述
android:id 设置控件的标识符号
android:layout_width 设置子组件的布局宽度
android:layout_height 设置子组件的布局高度
android:background 设置控件的背景色
android:text 设置文本的内容
android:textSize 设置文字的大小
android:textColor 设置文本的颜色
android:gravity 控制控件内容的位置
android:textAlignment 设置文字的对齐方式

在这里插入图片描述

ImageView简介

继承自View

属性名称 作用描述
android:id 设置控件的标识符号
android:layout_width 设置子组件的布局宽度
android:layout_height 设置子组件的布局高度
android:layout_alignParentStart 紧贴父元素结束位置开始
android:layout_alignParentLeft 当前控件左侧与父控件左侧对齐
android:layout_marginStart 设置控件开始的位置的距离
android:layout_marginLeft 设置距离左边框的距离

在这里插入图片描述

示例如下:
在这里插入图片描述

RadioButton简介

RadioButton继承于Button,所以具有普通按钮的各种属性,但是和普通按钮不同的是,在使用RadioButton的时候,要使用RadioGroup来包围起RadioButton
RadioGroup是LinearLayout的子类,所以RadioGroup本质上是一个存放RadioButton的布局容器

属性名称 作用描述
android:id 设置控件的标识符号
android:layout_width 设置子组件的布局宽度
android:layout_height 设置子组件的布局高度
android:background 设置控件的背景色
android:text 设置文本的内容
android:textSize 设置文字的大小
android:textColor 设置文本的颜色
android:gravity 控制控件内容的位置
android:textAlignment 设置文字的对齐方式

在这里插入图片描述
实例如下:
在这里插入图片描述

Activity

*活动
*Android组件中最基本也是最常见的组件
*在Android应用中,一个Activity通常就是一个单独的屏幕
*每个Activity都被实现为一个从活动积累继承来的独立的类
*活动类显示的用户接口由视图控件组成,并对事件做出响应

Activity的生命周期

Activity的生命周期很重要
主要包含六个方法:
onCreate,onStart,onResume,onPause,onStop,onDestory

onCreate函数: 注册你要用到的变量,比如说service,receiver,这些变量是无论你的Activity是在前台还是在后台都能够被响应到的,然后调用上面那个用来初始化的函数初始化布局信息。

onStart函数: 注册一些变量,这些变量必须在Activity在前台的时候才能够被响应。

onResume函数: 调用一些刷新UI的函数,每当Activity调用到这里时,就要刷新一下UI各控件的状态。

onPause函数: 一般是做一些变量的设置,因为这个时候Activity马上就要切到后台处理,可能有些变量就要被释放掉或者状态要做些相应的调整

onStop函数: 反注册在onStart函数中注册的变量。

onDestory函数: 反注册在onDestory函数中注册的变量。

多Activity的使用

Intent简介
在这里插入图片描述
使用实例
在这里插入图片描述

2019-10-12 10:25:37 qq_41273794 阅读数 22
  • 高焕堂讲解EIT造形(Part-2:应用篇)

    这是高老师的演讲视频,亲自讲解其EIT设计模式(造形)的应用情境。基于EIT造形,不仅人们容易从简单中组合出复杂;此外,组合出来的复杂系统,却是稳定而能有机成长的。除了促进互联互通的效益之外,又包容过去、现在和未来的通信协议,保护了过去的投资,并大幅提升顶层设计的未来性。

    5399 人正在学习 去看看 高煥堂

内容概要

  • Android控件架构
  • View的测量与绘制
  • ViewGroup的测量与绘制
  • 自定义控件的三种方式
  • 事件的拦截机制

3.1Android控件架构

在这里插入图片描述
每个Activity都包含一个window对象,在Android中Window对象通常由PhoneWindow来实现。PhoneWindow将一个DecorView设置为整个应用窗口的根View。DecorView作为窗口界面的顶层视图,封装了一些窗口操作的通用方法。DecorView将要显示的具体内容呈现在了PhoneWindow上,这里的所有View的监听事件,都通过WindowMannagerService来进行接收,并通过Activity对象来回调相应的onClickListener。在显示上,它将屏幕分成两部分,一个是TitleView,另外一个是ContentView。ContentView是一个的ID为content的Framelayout。

用户通过设置requestWindowFeature(Window.FEATURE_NO_TITLE)来设置全屏显示,视图布局就只有Content了,正因如此调用requestWindowFeature()方法一定要在调用setContentView方法之前才能生效。

在代码中,当程序在onCreate()方法中调用setContentView方法后,ActivityMannagerService会调用onResume()方法,此时系统会把整个DecorView添加到PhoneWindow中,让其显示出来,从而完成界面的绘制。

3.2View的测量

MeasureSpec类-----帮助测量View。
32位的int值,高2位位测量的模式,低30位为测量的大小,使用位运算提高并优化效率。

测量的模式

  • EXACTLY 精确模式
  • AT_MOST 最大值模式
  • UNSPECIFIED 此模式不指定大小测量模式,View想多大就多大,通常自定义View时使用

View的测量,重写onMeasure方法。View的源码onMeasure调用setMeasuredDimension(int measuredWidth, int measuredHeight)方法将测量后的宽高值设置进去。
具体代码`

package wangsheng.swpuiot.qunyingzhuan.ch3.section1;
//3.2View的测量


import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

public class MyView extends View {
    public MyView(Context context) {
        super(context);
    }

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

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
    }

    private int measureHeight(int heightMeasureSpec) {
        int result = 0;
        int specMode = MeasureSpec.getMode(heightMeasureSpec);
        int specSize = MeasureSpec.getSize(heightMeasureSpec);
        if (specMode == MeasureSpec.EXACTLY) {
            result = specSize;
        } else {
            result = 200;
            if (specMode == MeasureSpec.AT_MOST) {
                result = Math.min(result, specSize);
            }
        }
        return result;
    }

    private int measureWidth(int widthMeasureSpec) {
        int result = 0;
        int specMode = MeasureSpec.getMode(widthMeasureSpec);
        int specSize = MeasureSpec.getSize(widthMeasureSpec);
        if (specMode == MeasureSpec.EXACTLY) {
            result = specSize;
        } else {
            result = 200;
            if (specMode == MeasureSpec.AT_MOST) {
                result = Math.min(result, specSize);
            }
        }
        return result;
    }
}

这是宽高都设置为Wrap_Content
在这里插入图片描述
宽高都设置为match_parent
在这里插入图片描述
宽高都设置为400px
在这里插入图片描述

3.3View的绘制

测量好一个View之后,就可以简单重写onDraw(Canvas canvas)方法,并在Canvas对象上来绘制所需要的图形。
Canvas像是一个画板,使用Paint就可以在上面作画。

创建一个Canvas对象

Canvas	canvas = new Canvas(bitmap);

首先在onDraw()方法中绘制两个bitmap

canvas.drawBitmap(bitmap1,0,0,null);
canvas.drawBitmap(bitmap2,0,0,null);

对于bitmap2将它装载到另外一个Canvas对象中

Canvas mCanvas = new Canvas(bitmap2);

在其他地方使用Canvas对象的绘图方法在装在bitmap2的Canvas对象上进行绘图

mCanvas.drawXXX

虽然使用了Canvas绘制API,但其实并没有将图形直接绘制在onDraw()方法指定的那块画布上,而是通过改变bitmap,让View重绘,从而显示改变之后的bitmap。

3.4ViewGroup的测量

ViewGroup回去管理子View。当ViewGroup的大小为wrap_content时,ViewGroup的大小取决于所有子View的大小。其他模式通过具体指定值确定大小。

ViewGroup测量时通过遍历所有子View,从而调用子View的Measure方法来获取每一个子View的测量结果,即是对View的测量。

ViewGroup执行Layout过程时,使用遍历调用子View的Layout方法,并指定其具体显示位置,从而决定其布局位置
在自定义ViewGroup时,通常会去重写onLayout()方法来控制其子View显示位置的逻辑。如果ViewGroup要支持wrap_contebt同样要重写onMeasure()方法,与View相同。

3.5ViewGroup的绘制

ViewGroup通常不需要绘制,因为它本身没有要绘制的东西,如果不是指定了ViewGroup的背景颜色,那么ViewGroup的onDraw方法都不会调用。但是ViewGroup会使用dispatchDraw()方法来绘制其子View,其过程同样是通过遍历所有子View,并调用子View的绘制方法来完成绘制工作。

3.6自定义View

onDraw()方法绘制View显示内容,如果需要wrap_content属性,还必须重写onMeasure()方法。通过自定义attrs属性可以设置新的属性配置值。

View中一些重要的回调方法

  • onFinishInflate():从XML加载组件后回调。
  • onSizeChanged():组件大小改变时回调。
  • onMeasure:回调该方法来进行测量。
  • onLayout():回调该方法来确定显示的位置。
  • onTouchEvent():监听到触摸事件的回调。

创建自定义View的时候不需要重写所有方法,重写特定条件的回调即可。

实现自定义控件的三种方法

  1. 对现有控件进行拓展
  2. 通过组合来实现新控件
  3. 重写View来实现全新的控件

对现有控件进行拓展
一个TextView控件的拓展
通过组合来实现新控件
标题栏组合控件

  1. 定义属性 自定义的属性
  2. 组合控件 把所有要组合的控件组合在ViewGroup中,可以通过定义接口,暴露接口给调用者实现点击事件
  3. 引用UI模板

3.8事件拦截机制分析

OnInterceptTouchEvent方法是我们主要关注的。dispatchTouchEvent方法虽然是事件分发的第一步,但一般情况不太会改写这个方法。

事件拦截机制三个重要方法

dispatchTouchEvent():分发事件
onInterceptTouchEvent():拦截事件
onTouchEvent():处理事件
举一个例子说明事件分发机制:

ViewGroupA:处于视图最下层
ViewGroupB:处于视图中间层
View:处于视图最上层
正常的事件分发机制流程:

ViewGroupA dispatchTouchEvent
ViewGroupA onInterceptTouchEvent
ViewGroupB dispatchTouchEvent
ViewGroupB onInterceptTouchEvent
View dispatchTouchEvent
View onTouchEvent
ViewGroupB onTouchEvent
ViewGroupA onTouchEvent
若ViewGroupB的onInterceptTouchEvent()方法返回true的分发机制流程:

ViewGroupA dispatchTouchEvent
ViewGroupA onInterceptTouchEvent
ViewGroupB dispatchTouchEvent
ViewGroupB onInterceptTouchEvent
ViewGroupB onTouchEvent
ViewGroupA onTouchEvent
若View的onTouchEvent()方法返回true的分发机制流程:

ViewGroupA dispatchTouchEvent
ViewGroupA onInterceptTouchEvent
ViewGroupB dispatchTouchEvent
ViewGroupB onInterceptTouchEvent
View dispatchTouchEvent
View onTouchEvent
若ViewGroupB的onTouchEvent()方法返回true的分发机制流程:

ViewGroupA dispatchTouchEvent
ViewGroupA onInterceptTouchEvent
ViewGroupB dispatchTouchEvent
ViewGroupB onInterceptTouchEvent
View dispatchTouchEvent
View onTouchEvent
ViewGroupB onTouchEvent
简单的说dispatchTouchEvent()和onInterceptTouchEvent()是从下往上一层一层分发下去的,而onTouchEvent()是从上往下一层一层分发下去的

2010-07-18 16:55:58 iteye_15461 阅读数 22
  • 高焕堂讲解EIT造形(Part-2:应用篇)

    这是高老师的演讲视频,亲自讲解其EIT设计模式(造形)的应用情境。基于EIT造形,不仅人们容易从简单中组合出复杂;此外,组合出来的复杂系统,却是稳定而能有机成长的。除了促进互联互通的效益之外,又包容过去、现在和未来的通信协议,保护了过去的投资,并大幅提升顶层设计的未来性。

    5399 人正在学习 去看看 高煥堂

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
   
android:orientation="vertical" android:layout_width="fill_parent" 
   
android:layout_height="fill_parent"> 
   
<!-- Header --> 
   
<TextView 
       
android:layout_width="fill_parent" 
       
android:layout_height="wrap_content" 
       
android:text="Your header"/> 
 
   
<!-- rest of your layout --> 
   
<ScrollView 
       
android:layout_width="fill_parent" 
       
android:layout_height="fill_content"> 
           
<TextView 
               
android:layout_width="fill_parent" 
               
android:layout_height="wrap_content" 
               
android:text="Foo"/> 
           
<TextView 
               
android:layout_width="fill_parent" 
               
android:layout_height="wrap_content" 
               
android:text="Bar"/> 
           
<TextView 
               
android:layout_width="fill_parent" 
               
android:layout_height="wrap_content" 
               
android:text="Baz"/> 
           
<TextView 
               
android:layout_width="fill_parent" 
               
android:layout_height="wrap_content" 
               
android:text="etc"/> 
       
</ScrollView> 
</LinearLayout> 

2019-07-11 19:04:46 qq_35605213 阅读数 233
  • 高焕堂讲解EIT造形(Part-2:应用篇)

    这是高老师的演讲视频,亲自讲解其EIT设计模式(造形)的应用情境。基于EIT造形,不仅人们容易从简单中组合出复杂;此外,组合出来的复杂系统,却是稳定而能有机成长的。除了促进互联互通的效益之外,又包容过去、现在和未来的通信协议,保护了过去的投资,并大幅提升顶层设计的未来性。

    5399 人正在学习 去看看 高煥堂

elevation属性字面意思是海拔、你可以理解为它是控件的厚度;我们日常使用控件都是只在乎宽高的,这个控件的厚度却很少在意;如果你不太理解,看一下CardView覆盖其它控件的例子;

Android的控件CardView提供了一系列的圆角、阴影之类的属性,相当好用;但是当CardView和其它的控件在同一布局中时,始终覆盖其它控件;

先来看一下效果:

<RelativeLayout
    android:layout_alignParentBottom="true"
    android:layout_width="match_parent"
    android:layout_margin="15dp"
    android:layout_height="300dp">
    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:cardCornerRadius="6dp"
        app:cardBackgroundColor="#60CF7C"
        ></androidx.cardview.widget.CardView>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="你好世界"
        android:textColor="#fff"
        android:textSize="33dp"
        android:layout_centerInParent="true"
        />
</RelativeLayout>

从代码可以看的出来,这个TextView是在CardView的上面的,按道理说应该是TextView在CardView上面显示,但是实际的效果TextView并没有显示;

--------------------------------------------------------------------------------------------------------------------

我们给TextView加上elevation属性试试:

<RelativeLayout
    android:layout_alignParentBottom="true"
    android:layout_width="match_parent"
    android:layout_margin="15dp"
    android:layout_height="300dp">
    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:cardCornerRadius="6dp"
        app:cardBackgroundColor="#60CF7C"
        ></androidx.cardview.widget.CardView>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="你好世界"
        android:textColor="#fff"
        android:textSize="33dp"
        android:elevation="2dp"
        android:layout_centerInParent="true"
        />
</RelativeLayout>

呦、显示出来了(android:elevation="1dp"的时候还不显示,改为android:elevation="2dp"就显示了,看来CardView的默认厚度在1-2dp之间);

其实像Button、CardView、AppCompatButton类似的控件都有一定的厚度,会优先显示在其它控件的前面;

在同一布局(例如:RelativeLayout)中,厚度大的控件会先展示出来、盖住其它的控件;

如果你的CardView始终展示在最前面、控件被CardView覆盖了,何以减小CardView的elevation,或增加需要显示控件的elevation;

没有更多推荐了,返回首页