目录
- 一、View控件:
- 1.概述:
- 2.View类常用属性及方法:
- 二、TextView控件:
- 1.常用属性:
- 2.创建自定义TextView控件:
- 第一步:创建MyTextView.java文件:
- 第二步:在XML文件中使用MyTextView:
- 三、EditText控件:
- 1.常用属性:
- 2.事件监听:
- 第一步:**创建监听类,实现接口TextWatcher,并实现接口中的三个方法。**
- 第二步:**为控件绑定监听。**
- 四、Button控件:
- 1.常用属性:
- 2.selector选择器:
- 3.事件监听:
- 方法一:纯java代码创建事件监听:
- 第一步:java中创建事件监听器:
- 方法二:xml属性+java代码绑定监听:
- 第一步:xml属性绑定方法:
- 第二步:java中创建myclick方法:
- 五、ImageView控件:
- 1.常用属性:
- 六、ProgressBar控件:
- 1.常用属性:
- 2.java动态控制进度条进度:
- 七、ImageButton控件:
- 1.常用属性:
- 八、Toast控件:
- 1.Toast使用方式:
- 第一步:创建Toast对象:
- 第二步:在需要的地方调用show方法进行消息提示:
- 2.设置Toast显示位置:
- 九、AlertDialog控件:
- 1.AlertDialog使用方式:
- 第一步:创建AlertDialog对象:
- 第二步:在需要的地方调用show方法显示对话框:
- 2.设置AlertDialog布局:
- 十、CheckBox控件:
- 1.常用属性:
- 2.事件监听:
- 十一、RadioGroup&RadioButton控件:
- 1.常用属性:
- 2.事件监听:
- 十二、Spinner控件:
- 1.常用属性:
- 2.事件监听:
- 十三、ArrayAdapter适配器:
- 1.作用:
- 2.使用方式:
- 方式一:读取资源文件中定义的列表项。
- 第一步:在values文件夹中定义数据文件;
- 第二步:将该数据文件封装进ArrayAdapter类的对象中;
- 第三步:将Spinner绑定该Adapter对象。
- 方式二:通过List集合或者数组设置列表项。
- 第一步:创建List集合对象,定义数据;
- 第二步:将该List对象封装进ArrayAdapter类的对象中;
- 第三步:将Spinner绑定该Adapter对象。
- 十四、DatePicker控件:
- 1.常用属性:
- 2.事件监听:
- 十五、TimePicker控件:
- 1.常用属性:
- 2.事件监听:
- 十六、ListView控件:
- 1.常用属性:
- 2.使用ArrayAdapter为ListView绑定数据源:
- 3. 使用SimpleAdapter为ListView绑定数据源:
- 4.SimpleCursorAdapter为ListView绑定数据源:
- 5.事件监听:
- 十七、Toolbar控件:
- 1.常用XML属性:
- 2.事件监听:
- 十八、ViewPager控件:
- 1.实现页面左右滑动:
- 第一步:创建ViewPager标签:
- 第二步:使用PagerAdapter为ViewPager填充布局:
- 十九、Shape标签:
- 1.绘制圆角矩形:
- 二十、GridView控件:
- 二十一、VideoView控件:
- 1.播放网络视频的方式:
- 二十二、ViewFlipper控件:
- 1.开启轮播:
- 二十三、LinearLayout嵌套案例:登陆界面
- 1.效果:
- 2.布局文件:
- 3.圆角矩形图片:
一、View控件:
1.概述:
- View是构建用户界面控件(Button,Textfields等等)的父类,所有的用户界面可见控件以及布局类都是由View派生来的。
- 一个View占用了屏幕上的一个矩形区域并且负责界面绘制和事件处理,能够实现所占据区域的界面绘制、焦点变化和界面事件处理等功能。
- 绝大部份UI控件放在android.widget包及其子jar包,android.view包及其子jar包中。
2.View类常用属性及方法:
- 我们可以在java类中通过方法创建控件并给控件设置属性,也可以通过在xml文件中添加标签的方式创建控件。
二、TextView控件:
- 文本类控件,用来显示文本。
1.常用属性:
<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_one"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="文本:123456789101112131415"
android:textColor="#FFFF0000"
android:textStyle="bold"
android:textSize="50sp"
android:background="#FF00FFFF"
android:gravity="center"
android:shadowColor="@color/purple_700"
android:shadowRadius="3.0"
android:shadowDx="20.0"
android:shadowDy="20.0"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"/>
<!--
1.id:设置该TestView的id,方便java代码通过findViewById(R.id.tv_one)获取该组件。
2.layout_width:设置组件宽度
match_parent:宽度设置为父容器宽度,即LinearLayout的宽度。
wrap_content:根据该控件里面的内容自动分配宽度。
200dp:手动设置组件宽度,单位为dp。
3.layout_height:设置组件高度
4.text:设置组件显示的文本内容
5.textColor:设置文本颜色
6.textStyle:设置文本样式
bold:加粗
italic:斜体
normal:常规
7.textSize:设置文本大小,单位为sp
8.background:设置控件背景(图片为背景或背景色)
9.gravity:设置控件中内容的对齐方式
10.padding:控件显示的文字内容与控件边界的距离。
11.layout_margin:本控件与其它相邻控件及父控件上下左右的距离。
12.drawableRight:文本框右边绘制图片。
13.autoLink设置是否当文本超链接:none/web/email/phone/map/all
14.设置文字阴影:
(1)shadowColor:设置阴影文字的颜色
(2)shadowRadius:设置阴影透明度
(3)shadowDx:设置阴影与原文字的x轴偏移量
(4)shadowDy:设置阴影与原文字的y轴偏移量
15.设置文字跑马灯效果:
(1)singleLine:设置内容单行显示
(2)ellipsize:设置文本省略
start:文本过长时省略前面的文字
end:文本过长时省略后面的文字
marquee:实现文字跑马灯效果
(3)marqueeRepeatLimit:"marquee_forever"重复滚动无限次
(4)focusable:是否可以获取焦点
(5)focusableInTouchMode:触摸模式下是否可以获取焦点
(6)clickable:鼠标点击实现跑马灯
16.letterSpacing:字符间距,最大值为1
-->
</LinearLayout>
2.创建自定义TextView控件:
第一步:创建MyTextView.java文件:
- 必须继承TextView父类。
- 必须重写父类的构造方法。
package com.example.t.androidproject.myapplication2;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;
import androidx.annotation.Nullable;
import android.annotation.SuppressLint;
@SuppressLint("AppCompatCustomView")
public class MyTestView extends TextView {
public MyTestView(Context context) {
super(context);
}
public MyTestView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public MyTestView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
//我们可以重写类中的方法变成我们需要的方法,这里是设置控件默认聚焦为true
@Override
public boolean isFocused() {
return true;
}
}
第二步:在XML文件中使用MyTextView:
- 使用方法同默认的TextView控件。
<com.example.t.androidproject.myapplication2.MyTestView
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
- EditText是用来输入和编辑字符串的控件。
1.常用属性:
<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_height="100dp"
android:layout_width="200dp"
android:hint="请输入用户名"
android:textColorHint="@color/blue"
android:inputType="phone"
android:drawableLeft="@drawable/ic_baseline_how_to_reg_24"
android:drawablePadding="20dp"
android:paddingLeft="20dp"
android:background="@color/white"/>
<!--
1.EditText继承了TextView,所以EditText标签可以使用TextView的全部属性
2.hint:输入框提示文字
3.textColorHint:提示文字的颜色
4.inputType:输入类型(手机号,密码,邮箱...)
5.drawableXXX:输入框指定位置添加图片
6.drawablePadding:图片与输入内容的间距
7.background:@null:可以去除输入框的下划线及边框,也可以设置边框
8.maxLength:限制输入字符数量
9.singleLine:设置文本行数
10.maxLines:设置最大的显示行数
11.minLines:设置最小的显示行数
-->
</LinearLayout>
2.事件监听:
第一步:创建监听类,实现接口TextWatcher,并实现接口中的三个方法。
public void afterTextChanged(Editable s) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
public void beforeTextChanged(CharSequence s, int start, int count, int after){}
第二步:为控件绑定监听。
//该方法位于监听类内的方法。
public void addTextChangedListener(TextWatcher watcher)
1.常用属性:
<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:text="按钮"
android:backgroundTint="@drawable/color_select"
android:background="@drawable/button_select"
android:textSize="50sp"
android:layout_height="100dp"
android:layout_width="200dp"/>
<!--
1.Button按钮继承了TextView,所以Button标签可以使用TextView的全部属性
2.设置按钮按下、松开时背景颜色切换:
backgroundTint:设置背景颜色,通过绑定drawable/color_select.xml文件进行颜色切换
3.设置按钮按下、松开时背景图片切换:
background:设置背景颜色,通过绑定drawable/button_select.xml文件进行颜色切换
-->
</LinearLayout>
2.selector选择器:
- 创建在drawable文件夹下。
button_select.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_baseline_add_circle_24" android:state_pressed="true"/>
<item android:drawable="@drawable/ic_baseline_add_circle_outline_24"/>
</selector>
<!--selector选择器:
drawable:设置背景图片,背景图片必须用drawable属性
state_pressed:设置按钮按下时的背景图片
-->
color_select.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/gray" android:state_pressed="true"/>
<item android:color="@color/blue"/>
</selector>
<!--selector选择器:
color:设置颜色,背景颜色必须用color属性
state_pressed:设置按钮按下时的背景颜色
-->
3.事件监听:
方法一:纯java代码创建事件监听:
第一步:java中创建事件监听器:
package com.example.t.androidproject.myapplication2;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import androidx.annotation.Nullable;
public class LoginActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avtivity_login);
//根据button标签的id获取button
Button btn = findViewById(R.id.mybtn1);
//btn按钮绑定监听,设置按钮点击事件
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//按钮点击时修改按钮文本内容
btn.setText("按钮点击");
}
});
//btn按钮绑定监听,设置按钮长按事件
btn.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//按钮长按时修改按钮文本内容
btn.setText("按钮长按");
//注意如果这里的返回值如果是true,则按钮按钮点击事件不会执行
//如果这里的返回值如果是false,则按钮按钮点击事件会执行
return false;
}
});
//btn按钮绑定监听,设置按钮触摸事件
btn.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//按钮触摸时修改按钮文本内容
btn.setText("按钮触摸");
//注意如果这里的返回值如果是true,则按钮长按、按钮点击事件都不会执行
//如果这里的返回值如果是false,则按钮长按、按钮点击事件都会执行
return false;
}
});
//三个事件执行顺序:
//onTouch事件--->onLongClick--->onClick,返回值都为false时依次执行,如果某个事件返回值为true,则其后面的事件将不会执行
}
}
方法二:xml属性+java代码绑定监听:
第一步:xml属性绑定方法:
<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/mybtn1"
android:text="按钮"
android:textSize="50sp"
android:layout_height="100dp"
android:layout_width="200dp"
android:onClick="myclick"/>
<!--
onclick:设置点击按钮的事件监听,myclick是我们在java中自己写的方法
-->
</LinearLayout>
第二步:java中创建myclick方法:
package com.example.t.androidproject.myapplication2;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import androidx.annotation.Nullable;
public class LoginActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avtivity_login);
}
//我们自己写的方法
public void myclick(View view) {
//根据button标签的id获取button
Button btn = findViewById(R.id.mybtn1);
//按钮触摸时修改按钮文本内容
btn.setText("按钮触摸");
}
}
1.常用属性:
<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/image1"
android:scaleType="fitXY"
android:maxHeight="200dp"
android:maxWidth="200dp"
android:adjustViewBounds="true"/>
<!--
1.src设置图片路径
2.scaleType:设置图片缩放
fitCenter:默认,等比缩放图片后放于控件中间
fitStart:等比缩放图片后放于控件左上角
fitEnd:等比缩放图片后放于控件右下角
fitXY:非等比拉伸图片占满ImageView
centerCrop:等比拉伸图片占满ImageView,多余的部分裁剪
center:保持原图大小,显示在控件中心,若图片过大,则进行裁剪
centerInside:等比缩放图片至控件完全显示图片
matrix:保持原图大小,截取图片左上角部分至铺满控件
3.等比缩放图片铺满控件:
maxHeight:最大高度
maxWidth:最大宽度
adjustViewBounds:允许自动调整图片大小,宽高哪个边先达到设定的max值,另一条边进行等比缩放
需要设置layout_width和layout_height = wrap_content
-->
</LinearLayout>
- 进度条控件。
1.常用属性:
<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
android:id="@+id/pb1"
android:layout_width="300dp"
android:layout_height="100dp"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:max="100"/>
<!--
1.style="@style/Widget.AppCompat.ProgressBar.Horizontal":设置水平进度条,默认不写是圆形进度条
2.max:进度条最大值
3.progress:进度条已完成进度值
4.indeterminate:是否显示进度
5.visibility:设置进度条的可见性
View.VISIBLE:设置进度条可见
View.INVISIBLE:不可见,但这个View仍然会占用在xml文件中所分配的布局空间,不重新layout
View.GONE:设置进度条不可见,不占布局空间
-->
</LinearLayout>
2.java动态控制进度条进度:
//我们自己写的方法,点击按钮(按钮调用了该方法),进度条进度+1
public void myclick(View view) {
//根据标签的id获取ProgressBar
ProgressBar pb1 = findViewById(R.id.pb1);
//获取进度条当前进度
int progress = pb1.getProgress();
progress = progress+1;
//修改进度条进度
pb1.setProgress(progress);
/*其他方法:
pb1.incrementProgressBy(int diff)指定增加的进度
pb1.setVisibility(int v)设置该进度条是否可视
pb1.setMax(int max)设置进度条的最大值
*/
}
- 图片按钮控件。
1.常用属性:
<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageButton
android:layout_width="300dp"
android:layout_height="100dp"
android:src="@drawable/image1"/>
<!--
1.src:设置按钮图片
-->
</LinearLayout>
- 提醒用户的快捷短消息的窗口。
- 直接在Java中创建,不需要在布局文件中创建。
1.Toast使用方式:
第一步:创建Toast对象:
package com.example.t.androidproject.myapplication2;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.Nullable;
public class LoginActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avtivity_login);
Button btn = findViewById(R.id.btn1);
/*方式一:
static Toast makeText(Context context, CharSequence text, int duration)
1.context是toast显示在哪个作用域,通常是当前Activity。
2.text指显示的文本内容。
3.duration指定显示时间,Toast默认有LENGTH_SHORT和LENGTH_LONG两常量,分别表示短时间显示和长时间显示。
*/
Toast toast1 = Toast.makeText(this, "提示信息", Toast.LENGTH_SHORT);
/*方式二
static Toast makeText(Context context, int resId, int duration)
1.context是toast显示在哪个作用域,通常是当前Activity。
2.resId指显示内容,使用string.xml中定义的显示的消息内容,通过R.java来引用。
3.duration指定显示时间,Toast默认有LENGTH_SHORT和LENGTH_LONG两常量,分别表示短时间显示和长时间显示。
*/
Toast toast2 = Toast.makeText(this, R.string.app_name, Toast.LENGTH_SHORT);
}
}
第二步:在需要的地方调用show方法进行消息提示:
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {//点击按钮会提示
toast1.show();
}
});
2.设置Toast显示位置:
- 不设置该方法默认显示在屏幕居中靠下位置。
/*
public void setGravity(int gravity, int xOffset, int yOffset)
三个参数分别表示(起点位置,水平向右位移,垂直向下位移)
*/
toast1.setGravity(Gravity.CENTER, 0, 0);//显示在屏幕正中间
- 消息弹框。
- 直接在Java中创建,不需要在布局文件中创建。
1.AlertDialog使用方式:
第一步:创建AlertDialog对象:
package com.example.t.androidproject.myapplication2;
import android.app.Activity;
import android.content.DialogInterface;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AlertDialog;
public class LoginActivity extends Activity {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avtivity_login);
Button btn = findViewById(R.id.btn);
//创建构建器对象
AlertDialog.Builder builder = new AlertDialog.Builder(this);
//创建AlertDialog对话框,并设置属性
AlertDialog alertDialog = builder.setIcon(R.mipmap.qq)//添加图标
.setTitle("我是对话框")//添加标题
.setMessage("对话框内容")//添加内容
/*对话框上添加确定按钮
setPositiveButton(CharSequence text, DialogInterface.OnClickListener listener)
text:按钮文本
listener:事件监听器,内含点击按钮触发的事件
*/
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
/*对话框上添加取消按钮
setNegativeButton (CharSequence text, DialogInterface.OnClickListener listener)
text:按钮文本
listener:事件监听器,内含点击按钮触发的事件
*/
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
/*对话框上添加忽略按钮
setNeutralButton (CharSequence text, DialogInterface.OnClickListener listener)
text:按钮文本
listener:事件监听器,内含点击按钮触发的事件
*/
.setNeutralButton("忽略", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.create();//创建对话框,必须在链式调用的最后执行create方法创建对话框
}
}
第二步:在需要的地方调用show方法显示对话框:
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {//点击按钮会显示对话框
//显示对话框
alertDialog.show();
}
});
2.设置AlertDialog布局:
//获取布局文件
View dialogView = getLayoutInflater().inflate(R.layout.avtivity_login, null);
//调用构建器对象的setView方法添加布局文件
builder.setView(dialogView);
- 复选框。
1.常用属性:
<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<CheckBox
android:id="@+id/c2"
android:layout_width="200dp"
android:layout_height="100dp"
android:text="复选框1"
/>
<CheckBox
android:id="@+id/c1"
android:layout_width="200dp"
android:layout_height="100dp"
android:text="复选框2"
android:checked="true"
/>
</LinearLayout>
<!--
1.继承了TextView和Button,可以使用TextView和Button的所有属性
2.checked:默认是否被选中
-->
2.事件监听:
package com.example.t.androidproject.myapplication2;
import android.app.Activity;
import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import androidx.annotation.Nullable;
public class LoginActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avtivity_login);
CheckBox c1 = findViewById(R.id.c1);
CheckBox c2 = findViewById(R.id.c2);
/*
常用方法
1.public boolean isChecked():确定复选框是否被选中。
2.public void setChecked(boolean checked):设置默认选中
3.public void toggle():切换复选框的选中和未选中状态
*/
c1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
/*
第一个参数buttonView:状态发生改变的CompoundButton按钮
第二个参数checked:表示当前点击的CheckBox是否为选中(Checked)状态。
*/
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked == true){//CheckBox被选中时执行dosome
//dosome
}
}
});
c2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked == true){
//dosome
}
}
});
}
}
- RadioGroup是单选框的容器,RadioButton是单个单选框。
1.常用属性:
<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RadioGroup
android:id="@+id/g1"
android:layout_width="500dp"
android:layout_height="500dp">
<RadioButton
android:id="@+id/b1"
android:layout_width="100dp"
android:layout_height="100dp"
android:text="单选钮1"/>
<RadioButton
android:id="@+id/b2"
android:layout_width="100dp"
android:layout_height="100dp"
android:text="单选钮2"
android:checked="true"/>
</RadioGroup>
</LinearLayout>
<!--RadioGroup
1.继承了LinearLayout
-->
<!--RadioButton
1.继承了TextView和Button,可以使用TextView和Button的所有属性
2.checked:默认是否被选中
-->
2.事件监听:
- 对RadioGroup进行事件监听。
package com.example.t.androidproject.myapplication2;
import android.app.Activity;
import android.os.Bundle;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import androidx.annotation.Nullable;
public class LoginActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avtivity_login);
RadioGroup g1 = findViewById(R.id.g1);
/*RadioButton常用方法
public boolean isChecked():确定单选框是否被选中。
public void setChecked(boolean checked):设置默认选中。
public void toggle():切换单选框的选中和未选中状态。
*/
//单选框组RadioGroup状态发生改变时的事件监听
g1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
/*
第一个参数:状态发生改变的RadioGroup
第二个参数checkedId,表示当前被选中的RadioButton的ID。
*/
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
//获取被选中的RadioButton单选框
RadioButton radioButton = findViewById(checkedId);
//dosome
}
});
}
}
- 下拉列表框。
1.常用属性:
<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Spinner
android:id="@+id/spin1"
android:layout_width="200dp"
android:layout_height="200dp"
android:entries="@array/xiala"/>
</LinearLayout>
<!--Spinner
entries:下拉列表内容,需要在values/strings.xml中创建array标签
-->
2.事件监听:
package com.example.t.androidproject.myapplication2;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;
import androidx.annotation.Nullable;
public class LoginActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avtivity_login);
Spinner spinner1 = findViewById(R.id.spin1);
//下拉列表选项被选中时执行的事件
spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
/*选项被选中时触发的方法
AdapterView:选项被选中的视图列表
view:当前选中的item选项
position:被选中的item选项在视图中的位置
id:被选中item选项的id
*/
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
//获取被选中的元素
spinner1.getSelectedItem().toString();
}
//没有选项被选中时触发的方法
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
1.作用:
为Spinner控件设置列表项。
2.使用方式:
方式一:读取资源文件中定义的列表项。
第一步:在values文件夹中定义数据文件;
第二步:将该数据文件封装进ArrayAdapter类的对象中;
第三步:将Spinner绑定该Adapter对象。
package com.example.t.androidproject.myapplication2;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import androidx.annotation.Nullable;
public class LoginActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avtivity_login);
Spinner spinner1 = findViewById(R.id.spin1);
//将配置文件中的数据封装进ArrayAdapter
ArrayAdapter adapter = ArrayAdapter.createFromResource(this,R.array.xiala,android.R.layout.simple_spinner_item);
// 将ArrayAdapter绑定Spinner
spinner1.setAdapter(adapter);
}
}
方式二:通过List集合或者数组设置列表项。
第一步:创建List集合对象,定义数据;
第二步:将该List对象封装进ArrayAdapter类的对象中;
第三步:将Spinner绑定该Adapter对象。
package com.example.t.androidproject.myapplication2;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class LoginActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avtivity_login);
Spinner spinner1 = findViewById(R.id.spin1);
List list = new ArrayList();
list.add("选项1");
list.add("选项2");
//将list集合中的数据封装进ArrayAdapter(构造方法)
ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item,list);
// 将ArrayAdapter绑定Spinner
spinner1.setAdapter(adapter);
}
}
- 向用户提供包含年、月、日的日期数据并允许用户对其进行修改。
1.常用属性:
<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<DatePicker
android:id="@+id/date1"
android:layout_width="200dp"
android:layout_height="200dp"
android:datePickerMode="spinner"
android:calendarViewShown="false"/>
</LinearLayout>
<!--DatePicker
datePickerMode:日期控件外观,有两种:spinner,calendar
calendarViewShown:是否显示calendar类型的外观,
设置android:datePickerMode="spinner"时必须加该属性
-->
2.事件监听:
package com.example.t.androidproject.myapplication2;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.widget.DatePicker;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
public class LoginActivity extends Activity {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avtivity_login);
DatePicker data1 = findViewById(R.id.date1);
/*其他常用方法:
getDayOfMonth()获取日期天数
getMonth()获取日期月份0-11
getYear()获取年
updateDate(year,month,day)更新日期
init(year,month,day,dateChangedListener)初始化日期控件
*/
data1.setOnDateChangedListener(new DatePicker.OnDateChangedListener() {
//日期控件的日期改变时执行的事件
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
/*
view 与监听器关联的视图。
year 用户设置的年。
monthOfYear 用户设置的月份(0-11),与Calendar兼容。
dayOfMonth 用户设置的日期。
*/
}
});
}
}
- 向用户显示一天中的时间(可以为24小时制,也可以为AM/PM),并允许用户进行选择。
1.常用属性:
<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TimePicker
android:id="@+id/time1"
android:layout_width="300dp"
android:layout_height="400dp"
android:timePickerMode="spinner" />
</LinearLayout>
<!--TimePicker
timePickerMode:事件控件外观,有两种:spinner,clock
-->
2.事件监听:
package com.example.t.androidproject.myapplication2;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.widget.TimePicker;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
public class LoginActivity extends Activity {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avtivity_login);
TimePicker time1 = findViewById(R.id.time1);
/*其他常用方法:
getCurrentHour()获取当前小时
getCurrentMinute()获取当前分钟
setCurrentHour()修改当前小时事件
setCurrentMinute()修改当前分钟时间
*/
time1.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
//时间控件的时间改变时执行的事件
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
/*
View:与监听相关的视图。
hourOfDay:当前小时
Minute:当前分钟
*/
}
});
}
}
- ListView是一个列表控件,它以列表的形式展示具体内容,既可以方便的显示从系统中其他应用读取出来的数据,也可独立的为各行元素设置监听器。
- 每一行列表都是一个独立的元素。可以是一个字符串,也可以是一个组合控件。默认ListView中每个元素都是一个TextView。
1.常用属性:
<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:entries="@array/xiala"/>
</LinearLayout>
<!--ListView
entries:设置列表内容
divider:设置列表分隔条样式(引入图片样式)
dividerHeight:设置列表分隔条高度
-->
2.使用ArrayAdapter为ListView绑定数据源:
package com.example.t.androidproject.myapplication2;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import java.util.ArrayList;
import java.util.List;
public class LoginActivity extends Activity {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avtivity_login);
//获取ListView
ListView listview1 = findViewById(R.id.listview1);
//获取数据
List list = new ArrayList();
for (int i = 0; i < 20; i++) {
list.add("列表行"+i);
}
//ArrayAdapter适配器对象
/*
第一个参数:上下文
第二个参数:每行列表项(TextView)外观样式。Android为其提供如下属性样式,或者自己定义一个TextView的布局文件。
simple_list_item_1:每个列表项都是一个普通的textView
simple_list_item_2:每个列表项都是一个普通的textView(字体略大)
simple_list_item_checked:每个列表项都是一个已勾选的列表项
simple_list_item_multiple_choice:每个列表项都是带多选框的文本
simple_list_item_single_choice:每个列表项都是带单选框的文本
第三个参数:数据源(如:数组)
*/
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, list);
//ListView绑定适配器对象
listview1.setAdapter(adapter);
}
}
3. 使用SimpleAdapter为ListView绑定数据源:
package com.example.t.androidproject.myapplication2;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class LoginActivity extends Activity {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avtivity_login);
//获取ListView
ListView listview1 = findViewById(R.id.listview1);
//获取数据list(map())
List list = new ArrayList();
for (int i = 0; i < 4; i++) {
Map<String,String> map = new HashMap();
map.put("11","文本"+i);
map.put("22","按钮"+i);
map.put("33","编辑"+i);
list.add(map);
}
//SimpleAdapter适配器对象
/*public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
第一个参数:context,SimpleAdapter所要运行关联到的视图,一般指当前的Activity;
第二个参数:是个List集合对象,该集合中每一个Map对象对应一个列表项;
第三个参数:指定一个界面布局文件的id,即ListView里单个列表项的布局样式;
第四个参数:是Map<key,?>中键key,即每一行key中put的内容;
第五个参数:第3个参数布局文件里ListView单个列表项需要显示的所有控件的id,注意第四个和第五个参数要一一对应。
*/
SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.dan, new String[]{"11","22","33"}, new int[]{R.id.view1, R.id.btn1, R.id.edit1});
//ListView绑定适配器对象
listview1.setAdapter(adapter);
}
}
4.SimpleCursorAdapter为ListView绑定数据源:
常用于ListView对SQLite查询结果的渲染。
//查询数据
selectBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Cursor cursor = database.rawQuery("select stuId as _id,stuName,stuSex,stuAge from student", null);
SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(MainActivity.this,R.layout.one,cursor,new String[]{cursor.getColumnName(0),cursor.getColumnName(1),cursor.getColumnName(2),cursor.getColumnName(3)},new int[]{R.id.oneid,R.id.onename,R.id.onesex,R.id.oneage});
listview.setAdapter(cursorAdapter);
}
});
/* public SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to)
* context:上下文
* layout:ListView单个列表项布局样式
* c:游标,即SQLite查询结果
* from:查询结果的属性列
* to:每个属性列的查询结果渲染到哪个控件中,其中from和to要一一对应
* */
5.事件监听:
OnItemClickListener
:监听器在点击该项目的子项时触发。OnItemLongClickListener
:长按事件监听。OnTouchListener
:监听器在触碰到ListView时触发。OnScrollListener
:监听器在ListView滚动时触发。
listview1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
/*
ListView lv:被点击列表项属于哪个ListView
View v:被点击的item对象
int position:被点击的item对象是第几行
long id:被点击的item对象的id
*/
}
});
- 自定义Activity标题栏。
- 使用前首先修改themes.xml文件,使Activity不自动生成Toolbar:
<style name="Theme.MyApplication2" parent="Theme.MaterialComponents.DayNight.NoActionBar">
1.常用XML属性:
<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/tb1"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/blue"
app:title="标题"
app:titleTextColor="@color/purple_700"
app:titleMarginStart="0dp"
app:subtitle="子标题"
app:subtitleTextColor="@color/gray"
app:logo="@drawable/ic_launcher_foreground"
app:navigationIcon="@drawable/ic_baseline_arrow_back_24">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="居中标题"
android:layout_gravity="center"
android:gravity="center"/>
</androidx.appcompat.widget.Toolbar>
</LinearLayout>
<!--
1.background:设置背景色
2.title:标题
3.titleTextColor:标题颜色
4.titleMarginStart:标题左外边距
5.subtitle:子标题
6.subtitleTextColor:子标题颜色
7.logo:图片logo
8.navigationIcon:设置返回箭头
9.一般使用嵌套TextView的方法设置居中标题
-->
效果图:
2.事件监听:
package com.example.t.androidproject.myapplication2;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.NotificationCompat;
public class LoginActivity extends Activity {
NotificationManager manager;
Notification notification;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avtivity_login);
Toolbar toolbar = findViewById(R.id.tb1);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
//设置返回箭头navigationIcon的事件监听
@Override
public void onClick(View v) {
}
});
}
}
- 实现屏幕左右滑动切换页面。
1.实现页面左右滑动:
第一步:创建ViewPager标签:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="horizontal" >
<androidx.viewpager.widget.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/vp"/>
</LinearLayout>
第二步:使用PagerAdapter为ViewPager填充布局:
package com.example.t.androidproject.myapplication2;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import java.util.ArrayList;
import java.util.List;
public class LoginActivity extends Activity {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avtivity_login);
//LayoutInflater用于获取布局文件对象
LayoutInflater lf = getLayoutInflater();
//LayoutInflater对象的inflate方法来获取布局文件
View view1 = lf.inflate(R.layout.layout1,null);
View view2 = lf.inflate(R.layout.layout2,null);
View view3 = lf.inflate(R.layout.layout3,null);
//将多个Layout布局文件存入集合
List<View> list = new ArrayList();
list.add(view1);
list.add(view2);
list.add(view3);
//创建适配器,用于给viewpager添加多个布局文件,必须重写四个方法
PagerAdapter pagerAdapter = new PagerAdapter() {
@NonNull
@Override
//当要显示的布局文件可以进行缓存的时候,会调用这个方法将要显示布局的文件进行初始化。
//我们只需要将要显示的布局文件view加入到ViewGroup中,然后作为返回值返回即可
public Object instantiateItem(@NonNull ViewGroup container, int position) {
//将给定的布局对象view添加到ViewGroup容器中,创建并显示出来
container.addView(list.get(position),0);
//返回一个新页面
return list.get(position);
}
@Override
// 获取要滑动的布局文件的数量
public int getCount() {
return list.size();
}
@Override
//判断instantiateItem()返回的object与当前view是否是同一个,即判断显示的是否为同一个布局文件
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
//本案例PagerAdapter只缓存三张要显示的图片,如果滑动的图片超出了缓存的范围,就会调用这个方法,将布局文件销毁
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView(list.get(position));
}
};
//第一步:获取viewpager
ViewPager viewpager = findViewById(R.id.vp);
//第二步:使用Adapter为viewpager填充布局
viewpager.setAdapter(pagerAdapter);
}
}
- 用于绘制简单形状。
- corners(圆角)、gradient(渐变)、
solid(填充)、 padding(内边距)、 stroke(描边)、size(大小)
1.绘制圆角矩形:
- 在drawable文件夹下绘制,作为图片用于布局文件中。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<corners
android:topLeftRadius="10dp"
android:topRightRadius="10dp"
android:bottomLeftRadius="10dp"
android:bottomRightRadius="10dp"/>
<solid android:color="@color/blue"/>
</shape>
<!--
android:radius 全部的圆角半径,为角的弧度,值越大角越圆
android:topLeftRadius 左上角的圆角半径
android:topRightRadius 右上角的圆角半径
android:bottomLeftRadius 左下角的圆角半径
android:bottomRightRadius 右下角的圆角半径
solid:设置填充色
-->
<GridView
android:id="@+id/gridView1"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="0dp"
android:numColumns="2">
</GridView>
BaseAdapter ba=new BaseAdapter() {
@Override
public int getCount() {
return evaluatelist.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//单条评论信息
String[] strs=evaluatelist.get(position);
String username=strs[1];
String datail=strs[2];
LinearLayout menu_item=(LinearLayout) LayoutInflater.from(getActivity()).inflate(R.layout.evaluate_item, null);
TextView cname=(TextView) menu_item.findViewById(R.id.username);
cname.setText(username);
TextView clevel=(TextView) menu_item.findViewById(R.id.detail);
clevel.setText(datail);
return menu_item;
}
};
evaluateGridView.setAdapter(ba);
}
视频播放控件。
<VideoView
android:id="@+id/video"
android:layout_width="match_parent"
android:layout_height="200dp"/>
1.播放网络视频的方式:
String vurl = "https://.....................mp4";
video.setVideoPath(vurl);
video.requestFocus();
video.start();
轮播图控件。
<ViewFlipper
android:id="@+id/flipper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
<ImageView
android:id="@+id/swiper1"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ImageView
android:id="@+id/swiper2"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ImageView
android:id="@+id/swiper3"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ImageView
android:id="@+id/swiper4"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</ViewFlipper>
1.开启轮播:
ViewFlipper flipper = view.findViewById(R.id.flipper);
flipper.startFlipping();
1.效果:
2.布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
android:background="@mipmap/index">
<LinearLayout
android:layout_width="380dp"
android:layout_height="300dp"
android:layout_gravity="center_horizontal"
android:background="@drawable/shape_corner"
android:layout_marginTop="50dp"
android:orientation="vertical">
<!--图片加账号密码-->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<!--图片-->
<ImageView
android:layout_width="100dp"
android:layout_height="120dp"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:background="@mipmap/qq" />
<!--账号密码框-->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_marginLeft="8dp"
android:background="@drawable/shape_corner"
android:backgroundTint="@color/white"
android:layout_marginTop="15dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginRight="5dp"
android:layout_gravity="center"
android:text="账号"
android:textSize="20sp"/>
<EditText
android:layout_width="200dp"
android:layout_height="50dp"
android:hint="输入账号"
android:textColor="@color/gray"
android:paddingLeft="5dp"
android:background="@null"
android:drawableRight="@drawable/ic_baseline_arrow_drop_down_24"/>
</LinearLayout>
<LinearLayout
android:layout_marginLeft="8dp"
android:background="@drawable/shape_corner"
android:backgroundTint="@color/white"
android:layout_marginTop="15dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginRight="5dp"
android:layout_gravity="center"
android:text="密码"
android:textSize="20sp"/>
<EditText
android:layout_width="200dp"
android:layout_height="50dp"
android:textColor="@color/gray"
android:paddingLeft="5dp"
android:background="@null"
android:drawableRight="@drawable/ic_baseline_arrow_drop_down_24"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="记住密码"
android:textSize="18sp"
android:layout_marginLeft="25dp"
android:layout_marginTop="15dp"
android:checked="true"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="自动登录"
android:textSize="18sp"
android:layout_marginLeft="125dp"
android:layout_marginTop="15dp"
android:checked="true"/>
</LinearLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:backgroundTint="@color/blue"
android:gravity="center"
android:paddingLeft="80dp"
android:paddingTop="20dp"
android:paddingRight="80dp"
android:paddingBottom="20dp"
android:text="登录"
android:textSize="20sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="20dp"
android:orientation="horizontal">
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="隐身登录"
android:textSize="18sp"
android:textColor="@color/gray"
android:layout_marginLeft="25dp"
android:layout_marginTop="15dp"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开启震动"
android:textSize="18sp"
android:textColor="@color/gray"
android:layout_marginLeft="125dp"
android:layout_marginTop="15dp"/>
</LinearLayout>
<LinearLayout
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="20dp"
android:orientation="horizontal">
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="隐身登录"
android:textSize="18sp"
android:textColor="@color/gray"
android:layout_marginLeft="25dp"
android:layout_marginTop="15dp"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开启震动"
android:textSize="18sp"
android:textColor="@color/gray"
android:layout_marginLeft="125dp"
android:layout_marginTop="15dp"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="160dp"
android:orientation="horizontal"
android:background="@color/gray1">
<Button
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginLeft="25dp"
android:background="@drawable/ic_baseline_apps_24"
android:backgroundTint="@color/black" />
</LinearLayout>
</LinearLayout>
3.圆角矩形图片:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<corners
android:topLeftRadius="10dp"
android:topRightRadius="10dp"
android:bottomLeftRadius="10dp"
android:bottomRightRadius="10dp"/>
<solid android:color="@color/gray"/>
</shape>
<!--
android:radius 全部的圆角半径,为角的弧度,值越大角越圆
android:topLeftRadius 左上角的圆角半径
android:topRightRadius 右上角的圆角半径
android:bottomLeftRadius 左下角的圆角半径
android:bottomRightRadius 右下角的圆角半径
solid:设置填充色
-->