LZ-Says:冬瓜嫌弃LZ这个系列,说他都能看懂,哎呦我去,这个给人气的呀~真想把冬瓜剁吧剁吧熬成粥~

高考了,祝愿各位学子功成归来~!!!

基本控件使用

Android为我们提供了很多UI样式,但是在实际开发中,我们往往会根据UI图去为我们选择的绝大部分的控件进行渲染,从而达到产品更加的美观。

那么,我们使用的系统提供的UI,绝大部分是由View以及ViewGroup构成,而我们的每一个界面UI也是通过不同的组合实现。大概的图如下:

而今天,我们通过实践开始好好撸一波,继续回味回味~

首先,而今,Android布局再也不是曾经的五大布局了,又添加了一项名为ConstraintLayout(约束布局),这个放到后期我们进行具体使用。

那么,针对原有的五大布局中的表格布局,我们今天首先以此为开篇~

本文重点脑图呈现

一、TableLayout使用

表格布局,话说自从毕业之后就再也没用过这个鬼,某天看到还以为谷歌Baba又出了什么新东西呐,哈哈~

首先依据官方Api,查看下TableLayout的层级:

Enmmm,继承自LinearLayout,最终的Boss为Object,果然,Object,包罗万象~!

以下引用翻译自官方Api:

TableLayout:将其子项排列成行和列的布局。 TableLayout由多个TableRow对象组成,每个对象定义一行(实际上,还可以有其他子项)。 TableLayout容器不显示其行,列或单元格的边框线。每行有零个或多个单元格;每个单元格可以容纳一个View对象。该表具有与最多单元格一样多的列。表格可以让单元格为空。单元格可以跨越列,就像在HTML中一样。

列的宽度由该列中具有最宽单元格的行定义。但是,通过调用setColumnShrinkable()或setColumnStretchable(),TableLayout可以将某些列指定为可收缩或可伸展。如果标记为可收缩,则可以收缩列宽以使表适合其父对象。如果标记为可拉伸,则可以在宽度上扩展以适应任何额外的空间。表的总宽度由其父容器定义。重要的是要记住,一列可以缩小和拉伸。在这种情况下,该列将更改其大小以始终用尽可用空间,但从未更多。最后,你可以通过调用setColumnCollapsed()来隐藏一列。

TableLayout的子项不能指定layout_width属性。宽度总是MATCH_PARENT。但是,layout_height属性可以由子控件定义;默认值是ViewGroup.LayoutParams.WRAP_CONTENT。如果子控件是TableRow,那么高度总是ViewGroup.LayoutParams.WRAP_CONTENT。

单元格必须以增加的列依次顺序添加到行中,无论是在代码和XML中。列号是从零开始的。如果未指定子单元格的列号,则会自动增加到下一个可用列。如果跳过列号,它将被视为该行中的空单元格。

虽然TableLayout的典型子元素是TableRow,但实际上可以将任何View子类用作TableLayout的直接子元素。该视图将显示为跨越所有表格列的单个行。

而接下来,一起来了解下官方提供的Api详情:

对外暴露方法:

而最后,我们了解下关于Api中提供的具体属性所代表的含义以及使用:

  • android:collapseColumns:
    设置要被隐藏的列。 列索引必须用逗号分隔,例如:1,2,5。
  • android:shrinkColumns:
    设置要被缩小的列。 列索引必须用逗号分隔:1,2,5。 通过设置“*”来缩小所有列。一列可以同时被标记为可拉伸和收缩。
  • android:stretchColumns:
    设置要被拉伸的列。 列索引必须用逗号分隔:1,2,5。通过设置“*”来代替伸展所有列。 一列可以同时标记为可拉伸和收缩。

而下面,通过几个小例子来演示下,弥补当年的不足吧~

首先在XML布局中编写如下样式:

挨个测试上面说到的三个属性分别对应的实际的效果:

  • android:collapseColumns=”0,3”:
  • android:shrinkColumns=”1,3”:
  • android:stretchColumns=”1”: 这里设置个背景以及宽度,方便演示

二、Button系列

Button按钮,项目中几乎不可缺少的一个东东,今天好好扒光玩玩~

官方搜索Button,如下:

而下面,则依据上图进行依旧了解~ 当然,So easy的,就一概而过咯~

先来观赏一波层级:

Button从TextView身上派生出几个属性,主要用于设置阴影效果以及阴影位置,下面简单玩玩~

  • android:shadowColor: 阴影颜色;

  • android:shadowDx: 阴影位于X轴距离;

  • android:shadowDy: 阴影位于Y轴距离;

  • android:shadowRadius: 阴影角度。

下面附上部分代码:

<TextView
    android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:padding="15dp"android:shadowColor="#666"android:shadowDx="10"android:shadowDy="10"android:shadowRadius="15"android:text="贺大大"android:textSize="15sp" /><Button
    android:layout_width="match_parent"android:layout_height="wrap_content"android:shadowColor="#ff00"android:shadowDx="10"android:shadowDy="10"android:shadowRadius="15"android:text="文字带阴影" />

演示效果如下:

2.1 ZoomButton

老规矩,查看官方API提供的层级:

Enmmm,继续往下看,突然发现如下提示:

此类在API级别26中已被弃用。
使用其他方式来处理此功能。这个小部件仅仅是一个长按处理程序的简单包装。

Enmmm,那就再看看官方暴露的公共方法吧:

Enmmm,虽然弃用了,还是看看吧~

Enmmm,还是放弃了。。。

2.2 ToggleButton和Switch

严格意义来讲,这俩货都是Button派生出CompoundButton下的,不信看看官方提供API层级:

先从ToggleButton说起:

ToggleButton作为显示选中/未选中状态作为带有“指示灯”指示灯的按钮,默认情况下显示文字“开”或“关”。

另外我们还需要注意以下:

Android 4.0(API级别14)引入了另一种称为开关的切换按钮,它提供了一个滑块控件,可以为该控件添加一个Switch对象。 SwitchCompat是在设备上运行回到API 7的Switch小部件的一个版本。

下面附上官方盗图:

了解下旗下的XML属性:

Enmmm,还有如下:

查看官方为我们暴露的API:

下面来简单演示一波:

首先摆放ToggleButton控件:

<ToggleButton
    android:id="@+id/tbtn_off"android:layout_width="wrap_content"android:layout_height="wrap_content" />

设置事件:

private void initEvent() {mBind.tbtnOff.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {if (isChecked) {mBind.tbtnOff.setTextOff("开启");} else {mBind.tbtnOff.setTextOff("关闭");}}});
}

查看效果:

下面来说说我们的Switch小哥哥~

Switch是一个双态切换开关小部件,可以在两个选项中进行选择。用户可以前后拖动“拇指”来选择所选的选项,或者只需点击切换,就好像它是一个复选框。

该text 属性控制在标签切换显示的文本,而 off与on文本控件的大拇指上的文字。类似地, textAppearance和相关的setTypeface()方法控制标签文本的字体和样式,而switchTextAppearance和相关的setSwitchTypeface()方法控制该文本 的大小。

来瞅瞅官方提供的XML属性:

以及暴露的公共方法:



先来看一波效果图:

下面附上源码:

<?xml version="1.0" encoding="utf-8"?>
<layout><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"android:padding="15dp"tools:context=".study.SwitchActivity"><Switch
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:showText="true"android:splitTrack="true"android:switchMinWidth="100dp"android:textOff=" "android:textOn=" " /><Switch
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="15dp"android:showText="true"android:splitTrack="true"android:switchMinWidth="100dp"android:textOff="开"android:textOn="关" /><android.support.v7.widget.SwitchCompat
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="15dp" /><TextView
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="15dp"android:text="渣渣贺,再来个高仿IOS效果的吧~~~" /><Switch
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="15dp"android:switchMinWidth="20dp"android:textOff=" "android:textOn=" "android:thumb="@drawable/selector_thumb"android:track="@drawable/selector_track" /></LinearLayout>
</layout>

而我们最后的仿IOS效果,它的样式氛围俩个效果:thumb以及track。

那么针对thunb,我们需要注意以下:

  • 默认时,显示我们角标弧度、渐变背景色以及边框:

遂定义shape_bottom_close.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><size
        android:width="40dp"android:height="40dp" /><corners android:radius="20dp" /><gradient
        android:endColor="#eeeeee"android:startColor="#eeeeee" /><stroke
        android:width="1dp"android:color="#666666" />
</shape>
  • 点开后,显示我们角标弧度、渐变背景色以及边框(这时的边框颜色会发生改变)

遂定义shape_bottom_open.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><size
        android:width="40dp"android:height="40dp" /><corners android:radius="20dp" /><gradient
        android:endColor="#eeeeee"android:startColor="#eeeeee" /><stroke
        android:width="1dp"android:color="#33da33" />
</shape>

最后组合一块,定义selector_thumb.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/shape_bottom_open" android:state_checked="true" /><item android:drawable="@drawable/shape_bottom_close" />
</selector>

而关于滑动时的背景色,则如同上面角标设置一样:

  • 默认时,显示显示我们角标弧度、渐变背景色以及边框:

遂定义shape_button_close.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><size
        android:width="40dp"android:height="40dp" /><corners android:radius="20dp" /><gradient
        android:endColor="#eeeeee"android:startColor="#eeeeee" /><stroke
        android:width="1dp"android:color="#666666" />
</shape>
  • 点击后,显示显示我们角标弧度、渐变背景色(这里背景色改变)以及边框:

遂定义shape_button_open.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><size android:height="20dp" /><corners android:radius="20dp" /><gradient
        android:endColor="#33da33"android:startColor="#33da33" />
</shape>

最后组合起来即可,遂定义selector_track.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"><item android:drawable="@drawable/shape_button_open" android:state_checked="true" /><item android:drawable="@drawable/shape_button_close" />
</selector>

Enmmm,就这样大功告成了,虽然和IOS相比有些生硬,后期可以通过动画或者直接自定义View,重写即可实现,这里就不一一讲述了。

三、ExpandableListView可展开列表

老规矩,查看官方提供API层级:

其实要说这位是个什么鬼?直接查看QQ联系人那块即可明了。

先看一下实现的效果:

模拟下接下来要用的Json格式:

那就搞起来~~~

Step 1:搭建布局

<?xml version="1.0" encoding="utf-8"?>
<layout><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".study.ExpandableListViewActivity"><ExpandableListView
            android:id="@+id/elv_show"android:layout_width="match_parent"android:layout_height="match_parent" /></android.support.constraint.ConstraintLayout>
</layout>

Step 2:依据Json生成实体类

有需要的看源码吧~

Step 3:Adapter开撸

package com.hlq.androidroad_01.adapter;import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;import com.hlq.androidroad_01.HttpBean;
import com.hlq.androidroad_01.R;import java.util.List;/*** author : HLQ* e-mail : 925954424@qq.com* time   : 2018/06/14* desc   :* version: 1.0*/
public class ExpandableListViewAdapter extends BaseExpandableListAdapter {private Context mContext;private List<HttpBean> mGroupBeanList;public ExpandableListViewAdapter(Context mContext, List<HttpBean> mGroupBeanList) {this.mContext = mContext;this.mGroupBeanList = mGroupBeanList;}@Overridepublic int getGroupCount() {return mGroupBeanList.size();}@Overridepublic int getChildrenCount(int groupPosition) {return mGroupBeanList.get(groupPosition).getGroup_info().size();}@Overridepublic Object getGroup(int groupPosition) {return mGroupBeanList.get(groupPosition);}@Overridepublic Object getChild(int groupPosition, int childPosition) {return mGroupBeanList.get(groupPosition).getGroup_info().get(childPosition);}@Overridepublic long getGroupId(int groupPosition) {return groupPosition;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return childPosition;}@Overridepublic boolean hasStableIds() {return false;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {if (convertView == null) {convertView = LayoutInflater.from(mContext).inflate(R.layout.item_layout, null);}LinearLayout group = convertView.findViewById(R.id.group);group.setBackgroundColor(Color.GRAY);View view = convertView.findViewById(R.id.view_group);TextView tvTitle = convertView.findViewById(R.id.tv_group_title);if (groupPosition % 2 == 0) {view.setBackgroundColor(Color.RED);} else {view.setBackgroundColor(Color.GREEN);}tvTitle.setText(mGroupBeanList.get(groupPosition).getGroup_name());return convertView;}@Overridepublic View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {if (convertView == null) {convertView = LayoutInflater.from(mContext).inflate(R.layout.item_layout, null);}View view = convertView.findViewById(R.id.view_group);TextView tvTitle = convertView.findViewById(R.id.tv_group_title);if (childPosition % 2 == 0) {view.setBackgroundColor(Color.RED);} else {view.setBackgroundColor(Color.GREEN);}tvTitle.setText(mGroupBeanList.get(groupPosition).getGroup_info().get(childPosition).getChild_name());return convertView;}@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return false;}
}

Step 4:Enmmm,最后再哆嗦一波~

package com.hlq.androidroad_01.study;import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.hlq.androidroad_01.HttpBean;
import com.hlq.androidroad_01.R;
import com.hlq.androidroad_01.adapter.ExpandableListViewAdapter;
import com.hlq.androidroad_01.databinding.ActivityExpandableListViewBinding;import java.util.List;public class ExpandableListViewActivity extends AppCompatActivity {private ActivityExpandableListViewBinding mBind;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mBind = DataBindingUtil.setContentView(this, R.layout.activity_expandable_list_view);initView();}private void initView() {ExpandableListViewAdapter adapter = new ExpandableListViewAdapter(this, getHttpBeanList());mBind.elvShow.setAdapter(adapter);}public List<HttpBean> getHttpBeanList() {String jsonStr = "[{\"group_id\":\"001\",\"group_name\":\"河北省\",\"group_info\":[{\"child_id\":\"1\",\"child_name\":\"张家口\"},{\"child_id\":\"1\",\"child_name\":\"尚义\"},{\"child_id\":\"1\",\"child_name\":\"红土梁\"}]},{\"group_id\":\"001\",\"group_name\":\"北京市\",\"group_info\":[{\"child_id\":\"1\",\"child_name\":\"昌平\"},{\"child_id\":\"1\",\"child_name\":\"海淀\"}]},{\"group_id\":\"001\",\"group_name\":\"上海\",\"group_info\":[{\"child_id\":\"1\",\"child_name\":\"金山\"},{\"child_id\":\"1\",\"child_name\":\"浦东\"},{\"child_id\":\"1\",\"child_name\":\"浦西\"}]},{\"group_id\":\"001\",\"group_name\":\"搞个妹子\",\"group_info\":[]},{\"group_id\":\"001\",\"group_name\":\"哇咔咔\",\"group_info\":[{\"child_id\":\"1\",\"child_name\":\"嘻嘻嘻\"},{\"child_id\":\"1\",\"child_name\":\"嗷呜呜\"},{\"child_id\":\"1\",\"child_name\":\"嘿嘿嘿\"}]}]";List<HttpBean> httpBeanList = new Gson().fromJson(jsonStr, new TypeToken<List<HttpBean>>() {}.getType());return httpBeanList;}
}

四、AdapterViewAnimator

首先,老规矩,查看官方API提供的层级结构:

由上可见,直接派生出俩个子类,分别为AdapterViewFlipper以及StackView。这俩个东东说实话,LZ没怎么了解过,下面一起爽爽吧~

再来说下,AdapterViewAnimatore是个什么鬼?

鉴名其意,这是用于AdaterView的动画效果。那么下面看看官方所述:

AdapterView在其视图之间切换时,它的基类将执行动画。

这里查看下官方提供的属性:

4.1 AdapterViewFlipper

老规矩,官方查看API层级,简单了解:

据官方所述:

AdapterViewFlipper是一个很简单ViewAnimator,它将在添加到它的两个或多个视图之间生成动画。一次只显示一个孩子。如果有要求,可以定期在每个孩子之间自动翻动。

下面来看下为我们暴露的XML属性:

而下面则从官方截取暴露出来的公共方法:

再瞅瞅内容受保护的方法:

大体作为了解,参考,后期有需要的时候细细品味~

首先,来搭建我们的布局:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><RelativeLayout
        android:layout_width="match_parent"android:layout_height="match_parent"android:padding="15dp"tools:context=".study.AdapterViewFlipperActivity"><Button
            android:id="@+id/btn_pre"style="@style/ButtonStyle"android:layout_toStartOf="@id/btn_auto"android:text="上一项" /><Button
            android:id="@+id/btn_auto"style="@style/ButtonStyle"android:layout_centerHorizontal="true"android:text="自动播放" /><Button
            android:id="@+id/btn_next"style="@style/ButtonStyle"android:layout_toRightOf="@id/btn_auto"android:text="下一项" /><AdapterViewFlipper
            android:id="@+id/vf_show"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/btn_auto" /></RelativeLayout>
</layout>

接着实例化:

package com.hlq.androidroad_01.study;import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.SimpleAdapter;import com.hlq.androidroad_01.R;
import com.hlq.androidroad_01.databinding.ActivityAdapterViewFlipperBinding;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** author : HLQ* e-mail : 925954424@qq.com* time   : 2018/06/13* desc   : AdapterViewFlipper学习* version: 1.0*/
public class AdapterViewFlipperActivity extends AppCompatActivity implements View.OnClickListener {private ActivityAdapterViewFlipperBinding mFlipperBind;private int[] mImgRes = {R.drawable.img_01, R.drawable.img_02, R.drawable.img_03,R.drawable.img_04, R.drawable.img_05, R.drawable.img_06};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mFlipperBind = DataBindingUtil.setContentView(this, R.layout.activity_adapter_view_flipper);initView();initEvent();}private void initEvent() {mFlipperBind.btnPre.setOnClickListener(this);mFlipperBind.btnAuto.setOnClickListener(this);mFlipperBind.btnNext.setOnClickListener(this);}private List<Map<String, Integer>> getImageData() {List<Map<String, Integer>> imageResList = new ArrayList<>();for (int i = 0; i < mImgRes.length; i++) {HashMap<String, Integer> map = new HashMap<>();map.put("img", mImgRes[i]);imageResList.add(map);}return imageResList;}private void initView() {SimpleAdapter adapter = new SimpleAdapter(this, getImageData(),R.layout.item_image_view,new String[]{"img"},new int[]{R.id.item_img});mFlipperBind.vfShow.setAdapter(adapter);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_pre:mFlipperBind.vfShow.showPrevious();if (mFlipperBind.vfShow.isFlipping()) {mFlipperBind.vfShow.stopFlipping();}break;case R.id.btn_auto:mFlipperBind.vfShow.setFlipInterval(1500);mFlipperBind.vfShow.startFlipping();break;case R.id.btn_next:mFlipperBind.vfShow.showNext();if (mFlipperBind.vfShow.isFlipping()) {mFlipperBind.vfShow.stopFlipping();}break;}}
}

最后查看效果:

看到这个,我们能不能搞个轮播图呢?

4.2 StackView基本用法

首先依旧查看官方给出的层级,大概有个了解:

StackViewshi AdapterViewAnimator的子类,它主要用于显示Adapter提供的一系列View。而它将会以“堆叠”方式来展示多个item项。

StackView提供了俩种操作方式,如下:

  • 通过拖拽StackView顶部View来展示Item项。这里提供向上以及向下俩种方式,分别代表显示上个item以及显示下一个item;

  • 通过调用StackView提供的方法去控制显示上/下item项。

下面从官方找了些API,如下:

一起来看下效果:

先放置我们的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><RelativeLayout
        android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".study.StackViewActivity"><Button
            android:id="@+id/pre_btn"style="@style/ButtonStyle"android:text="上一张" /><Button
            android:id="@+id/next_btn"style="@style/ButtonStyle"android:layout_toRightOf="@id/pre_btn"android:text="下一张" /><StackView
            android:id="@+id/stackView"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/pre_btn"android:loopViews="true" /> </RelativeLayout>
</layout>

再来分分钟实现一波:

package com.hlq.androidroad_01.study;import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.SimpleAdapter;import com.hlq.androidroad_01.R;
import com.hlq.androidroad_01.databinding.ActivityStackViewBinding;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** author : HLQ* e-mail : 925954424@qq.com* time   : 2018/03/12* desc   : StackView学习* version: 1.0*/
public class StackViewActivity extends AppCompatActivity implements View.OnClickListener {private ActivityStackViewBinding mStackBind;private int[] mImgRes = {R.drawable.img_01, R.drawable.img_02, R.drawable.img_03,R.drawable.img_04, R.drawable.img_05, R.drawable.img_06};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mStackBind = DataBindingUtil.setContentView(this, R.layout.activity_stack_view);initView();initEvent();}private void initEvent() {mStackBind.preBtn.setOnClickListener(this);mStackBind.nextBtn.setOnClickListener(this);}private void initView() {SimpleAdapter adapter = new SimpleAdapter(this, getImageData(), R.layout.item_stack_view,new String[]{"img"},new int[]{R.id.item_img});mStackBind.stackView.setAdapter(adapter);}private List<Map<String, Integer>> getImageData() {List<Map<String, Integer>> imageResList = new ArrayList<>();for (int i = 0; i < mImgRes.length; i++) {HashMap<String, Integer> map = new HashMap<>();map.put("img", mImgRes[i]);imageResList.add(map);}return imageResList;}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.pre_btn:mStackBind.stackView.showPrevious();break;case R.id.next_btn:mStackBind.stackView.showNext();break;}}
}

小彩蛋

基本的东西,我们也要玩出花样~

来个霓虹灯版~

先来看一波效果~

傻傻的虎不拉机。。。

直接放上关键代码:

package com.hlq.androidroad_01.egg;import android.databinding.DataBindingUtil;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;import com.hlq.androidroad_01.R;
import com.hlq.androidroad_01.databinding.ActivityEgg1Binding;import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;/*** author : HLQ* e-mail : 925954424@qq.com* time   : 2018/06/07* desc   : 彩蛋之来个霓虹灯玩玩* version: 1.0*/
public class Egg1Activity extends AppCompatActivity {private ActivityEgg1Binding mEggBind;private View[] mViews;private int[] mColors = {Color.BLUE,Color.GRAY,Color.YELLOW};Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {if (msg.what == 0x000) {for (int i = 0; i < mViews.length; i++) {mViews[i].setBackgroundColor(mColors[new Random().nextInt(3)]);}}super.handleMessage(msg);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mEggBind = DataBindingUtil.setContentView(this, R.layout.activity_egg1);mViews = new View[]{mEggBind.view0, mEggBind.view1, mEggBind.view2};initTimer();}private void initTimer() {// 设置执行定时任务new Timer().schedule(new TimerTask() {@Overridepublic void run() {mHandler.sendEmptyMessage(0x000);}}, 0, 300);}
}

GitHub查看地址

https://github.com/HLQ-Struggle/AndroidRoad_01

结束语

到此,关于挑几个基本控件玩玩(上卷)完稿,欢迎各位老铁学习交流,一起努力向前冲,在此,感谢我鸡排大大~!!!

我鸡哥,永远666!!!就是这么傲娇~!!!

在放个地址:

http://www.dajipai.cc/

个人公众号

不定期发布博文,暂定一周至少俩篇,感谢各位

赞赏

觉得不错,可以来波赞赏,让LZ在炎热的帝都感受一丝丝风吹过的感觉~

参考资料

  1. 谷歌官方API:https://developer.android.google.cn/reference/;
  2. GuiDe-Topics:https://developer.android.google.cn/guide/topics/ui/;

重走Android路 之 挑几个基本控件玩玩(上卷)相关推荐

  1. 重走Android路 之 Android系统架构图以及开发工具了解

    LZ-Says:热腾腾的一天那,貌似今天帝都达到了高温,热腾腾,我滴天...各位老铁注意防暑,多喝水~~~ 前言 昨天更新了一篇启程文,地址如下: 重走Android路 之 今日正式启程:https: ...

  2. 重走Android路 之 今日正式启程

    LZ-Says:重拾路,奠基路,加油~! 前言 14年9月,到现在,三个多年头了,从帝都到廊坊,再从廊坊回到帝都,经历了很多,也看淡了很多. 相比技术而言,承担的越来越多,责任也随着年纪逐渐上升,压力 ...

  3. 情景剧《重走长征路》上演

    锣鼓喧天,鞭炮齐鸣,从东.南.西三个方向来的三支队伍在广场汇合,乡亲们的箩筐里放满了烤红薯.烤土豆.鸡蛋.大枣.煮玉米,老乡们敲着大鼓.腰鼓.扭着秧歌热烈欢迎着三支队伍."男女老少来相送,热 ...

  4. 重走长征路---OI每周刷题记录---8月16日 2014

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  5. 重走青春路……还是因到了“原点”……

    09年,我进入一个二本院校,读专科--网络技术应用专业,学数据结构,C,大一就这样过去了,在.对于专科类学习,专业方面其实也不是很重视,稍微上一下课就OK了,所以大一大部分时间都是空余的,我的时间大部 ...

  6. 重走长征路---OI每周刷题记录---9月6日 2014

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  7. 重走长征路---OI每周刷题记录---6月14日 2014

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  8. 重走长征路---OI每周刷题记录---4月12日 2015

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  9. 重走长征路---OI每周刷题记录---11月16日 2013

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

最新文章

  1. 期刊介绍 | SEL:力争成为土壤生态学界的“Cell”
  2. 你竟然还不懂变分自编码机?这个16岁的OpenAI天才实习生讲得可透彻了
  3. 【Kotlin】函数类型 ( 函数类型 | 带参数名称的参数列表 | 可空函数类型 | 复杂函数类型 | 带接收者函数类型 | 函数类型别名 | 函数类型实例化 | 函数调用 )
  4. mysql 经典优化案例_MySQL-SQL优化10大最经典案例详解
  5. python 字符串拼接_Python字符串拼接的6种方法(转)
  6. Python3--unitest框架的使用
  7. 使用可变对象作为Java Map的key,会带来潜在风险的一个例子
  8. 操作系统 —— 内存管理
  9. 网络拓扑Visio式的定制
  10. SOP 中的 Service
  11. Hive表中修改列位置,更改类型、移动位置(impala支不支持更改位置)
  12. 【mac】配置本地数据库
  13. 10个SQL注入工具
  14. MYSQL--未提交(read uncommitted)、读已提交(read committed)和repeatable read(可重复读)
  15. 三项式与组合数(lucas板子)
  16. 李宏毅机器学习2021作业7-Bert (Question Answering)
  17. http 状态码以及http请求、响应
  18. 转:《你对固态硬盘了解多少》
  19. oracle数据库关闭失败,Oracle突然关闭原因
  20. IPv6静态路由设置

热门文章

  1. 思杰桌面虚拟化终端设备的选择
  2. 2.dex反编译工具的安装(jadx、gda、jeb)
  3. vl53l1x激光测距讲解
  4. 手机控制树莓派linux,使用安卓手机控制树莓派
  5. NEO4J不存在某个关系的查询方式
  6. css关键词:inherit、initial、overlay、revert、unset解释
  7. IE和火狐的在js和css上的差别
  8. js时间戳转换年月日
  9. Node.js:NVM工具的使用 nvm常用命令
  10. H5无插件播放rtsp视频流