1.LinearLayout布局控件(线性布局)
- orientation:布局中组件的排列方式。
- gravity:控制组件所包含的子元素的对齐方式,可多个组合
- layout_gravity:控制该组件在父容器里的对齐方式。
- background:为该组件设置一个背景图片,或者是直接用颜色覆盖
- divider:分割线
- showDividers:设置分割线所在的位置,none(无),beginning(开始),end(结束),middle(每两个组件之间) 分割线为图片文件,需要事先准备好。
- dividerPadding 设置分割线的padding
- layout_weight(权重):该属性是用来等比例的划分区域
<?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"
android:divider="@mipmap/ic_launcher"
android:showDividers="middle"
android:dividerPadding="10dp"
android:gravity="center"
android:padding="10dp"
android:orientation="vertical">
<LinearLayout
android:layout_gravity="center"
android:background="#00ff00"
android:layout_width="100dp"
android:layout_height="100dp"/>
<LinearLayout
android:background="#ff00ff"
android:layout_width="100dp"
android:layout_height="100dp"/>
<LinearLayout
android:background="#ff0000"
android:layout_width="100dp"
android:layout_height="100dp"/>
</LinearLayout>
2.RelativeLayout布局控件(相对布局)
- 根据父容器定位
- layout_alignParentLeft:左对齐
- layout_alignParentRight:右对齐
- layout_alignParentTop:顶部对齐
- layout_alignParentBotton:底部对齐
- layout_centerHorizontal:水平居中
- layout_centerVertical:垂直居中
- layout_centerInParent:中间位位置
- 根据兄弟组件定位
- layout_toLeftOf:放置于参考组件的左边
- layout_toRightOf:放置于参考组件的右边
- layout_above:放置于参考组件的上方
- layout_below:放置于参考组件的下方
- layout_alignTop:放置于参考组件的上边界
- layout_alignBottom:对齐参考组件的上边界
- layout_alignLeft:对齐参考组件的左边界
- layout_alignRight:对齐参考组件的右边界
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="100dp"
xmlns:android="http://schemas.android.com/apk/res/android">
<RelativeLayout
android:id="@+id/rl_1"
android:background="#00ff00"
android:layout_width="100dp"
android:layout_height="100dp"/>
<RelativeLayout
android:layout_below="@+id/rl_1"
android:layout_marginLeft="100dp"
android:background="#00ffff"
android:layout_width="100dp"
android:layout_height="100dp"/>
</RelativeLayout>
3.FrameLayout控件布局(帧布局)
- foreground:设置前景
- foregroundGravity:设置前景位置
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<FrameLayout
android:background="#00ff00"
android:layout_width="400dp"
android:layout_height="400dp"/>
<FrameLayout
android:background="#00ffff"
android:foreground="@mipmap/ic_launcher"
android:foregroundGravity="right|bottom"
android:layout_width="200dp"
android:layout_height="200dp"/>
<FrameLayout
android:background="#ffff00"
android:layout_width="100dp"
android:layout_height="100dp"/>
</FrameLayout>
4.TableLayout布局控件(表格布局)
- collapseColumns:设置需要被隐藏的列的序号:从0开始
- stretchColumns:设置允许被拉伸的列的序号:从0开始
- shrinkColumns:设置允许被收缩的列的序号:从0开始
子控件设置属性
- layout_column:显示在第几列
- layout_span:横向跨几列
<?xml version="1.0" encoding="utf-8"?>
<TableLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:collapseColumns="1"
android:stretchColumns="2,4"
android:shrinkColumns="0"
xmlns:android="http://schemas.android.com/apk/res/android">
<TableRow>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮1"/>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="2"
android:text="按钮2"/>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="2"
android:text="按钮3"/>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮4"/>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮5"/>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮5"/>
</TableRow>
</TableLayout>
5.GridLayout布局控件(网格布局)
- orientation:设置水平显示还是垂直显示
- columnCount:设置行的显示个数
- rowCount:设置列的显示个数
子控件属性
- layout_column:显示在第几列
- layout_columnSpan:横向跨几列
- layout_columnWeight:横向剩余空间分配方式
- layout_gravity:在网格中的显示位置
- layout_row:显示在第几行
- layout_rowSpan:纵向跨几行
- layout_rowWeight:纵向剩余空间分配
<?xml version="1.0" encoding="utf-8"?>
<GridLayout android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="horizontal"
android:columnCount="2"
android:layout_rowWeight="2"
xmlns:android="http://schemas.android.com/apk/res/android">
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第一个"/>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第一个"/>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_columnSpan="2"
android:layout_columnWeight="1"
android:layout_gravity="center_vertical"
android:text="第一个"/>
</GridLayout>
6.ConsraintLayout布局控件(约束布局)
该布局与C#windows窗体应用相似,能够直接拖入控件,通过给控件添加约束来实现布局。
7.ListView控件
- 编写listview所在的layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
- 编写item所在的layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/tv"
android:textSize="30sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
- 编写mainActivity类中的逻辑
package com.tian.layoutlearn;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
List<Bean> data = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_view_learn_test);
for (int i = 0;i<100;i++){
Bean bean = new Bean();
bean.setName("快乐+"+i);
data.add(bean);
}
//找到lv控件
ListView listView = findViewById(R.id.lv);
listView.setAdapter(new MyAdapter(data,this));
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
}
});
}
}
- 创建自己的listview的适配器
package com.tian.layoutlearn;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
public class MyAdapter extends BaseAdapter {
private List<Bean> data;
private Context context;
public MyAdapter(List<Bean> data, Context context) {
this.data = data;
this.context = context;
}
//一共有多少个数据
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
//返回每个item条目
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView==null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.list_view_item_layout, parent, false);
viewHolder.textView = convertView.findViewById(R.id.tv);
convertView.setTag(viewHolder);
}else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.textView.setText(data.get(position).getName());
return convertView;
}
private final class ViewHolder{
TextView textView;
}
}
- 创建Bean
package com.tian.layoutlearn;
public class Bean {
String name;
public Bean() {
}
public Bean(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
8.RecyclerView控件
该控件为listview的加强自定义版,需要导入依赖
implementation 'androidx.recyclerview:recyclerview:1.1.0'
- 创建layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
- 创建item_layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/tv"
android:textSize="30sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
- 完成自定义Adapter
package com.tian.layoutlearn;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class ReMyAdapter extends RecyclerView.Adapter<ReMyAdapter.MyViewHolder> {
private List<Bean> data;
private Context context;
public ReMyAdapter(List<Bean> data, Context context) {
this.data = data;
this.context = context;
}
//初始化Holder
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = View.inflate(context,R.layout.list_view_item_layout,null);
return new MyViewHolder(view);
}
//绑定数据
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.tv.setText(data.get(position).getName());
}
//显示有多少个数据
@Override
public int getItemCount() {
if (data==null){
return 0;
}
return data.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
private TextView tv;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
tv = itemView.findViewById(R.id.tv);
}
}
}
- 实现Bean
package com.tian.layoutlearn;
public class Bean {
String name;
public Bean() {
}
public Bean(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 完成MainActivity逻辑
package com.tian.layoutlearn;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
List<Bean> data = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recyclerview_layout_learn);
for (int i = 0;i<100;i++){
Bean bean = new Bean();
bean.setName("快乐+"+i);
data.add(bean);
}
RecyclerView recyclerView = findViewById(R.id.rv);
ReMyAdapter reMyAdapter = new ReMyAdapter(data, this);
recyclerView.setAdapter(reMyAdapter);
//线性布局
// LinearLayoutManager layoutManager = new LinearLayoutManager(this);
//网格布局
// GridLayoutManager layoutManager = new GridLayoutManager(this, 3);
//瀑布流布局
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
//找到lv控件
// ListView listView = findViewById(R.id.lv);
// listView.setAdapter(new MyAdapter(data,this));
// listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
// @Override
// public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//
// }
// });
}
}
9.帧动画(逐帧动画)
将多张图片进行快速的播放
- 创建animation-list
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/suzumori_park_00111" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00113" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00115" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00117" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00119" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00121" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00123" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00125" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00127" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00129" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00131" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00133" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00135" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00137" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00139" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00141" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00143" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00145" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00147" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00149" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00151" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00153" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00155" android:duration="100"/>
<item android:drawable="@drawable/suzumori_park_00157" android:duration="100"/>
</animation-list>
- 创建layout
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rl"
android:background="@drawable/suzumori"
xmlns:android="http://schemas.android.com/apk/res/android">
</RelativeLayout>
- 实现MainActivity中逻辑
package com.tian.animationlearn;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.RelativeLayout;
public class MainActivity extends AppCompatActivity {
private boolean flag = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout relativeLayout = findViewById(R.id.rl);
AnimationDrawable animationDrawable = (AnimationDrawable) relativeLayout.getBackground();
relativeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (flag){
animationDrawable.start();
flag = false;
}else {
animationDrawable.stop();
flag =true;
}
}
});
}
}
- 实现图片
10.补间动画
- alpha 透明度
- fromAlpha 设置初始透明度
- toAlpha 设置最终达到的透明度
- duration 设置动画完成时间
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="0" android:toAlpha="1" android:duration="2000"/>
</set>
- rotate 旋转
- fromDegrees 设置初始旋转角度
- toDegrees 设置最终达到的旋转角度
- pivotx 设置旋转轴x坐标
- pivoty 设置旋转轴y坐标
- duration 设置动画完成时间
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" android:duration="2000"/>
</set>
- scale 缩放
- fromXScale设置图片初始X大小
- fromYScale设置图片初始Y大小
- toXScale设图片最终缩放X大小
- toYScale设置图片最终缩放Y大小
- pivotX 设置图片缩放中心轴X坐标
- pivotY设置图片缩放中心轴Y坐标
- duration设置图片动画完成时间
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="1"
android:fromYScale="1"
android:toXScale="0.5"
android:toYScale="0.5"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000"/>
</set>
- translate 平移
- duration 设置动画完成时间
- fromXDelta设置图片初始x偏移
- fromYDelta设置图片初始y偏移
- toXDelta设置图片最终X偏移
- toYDelta设置图片最终Y偏移
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="2000"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="400"
android:toYDelta="400"/>
</set>
公用代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:maxWidth="300dp"
android:maxHeight="300dp"
android:adjustViewBounds="true"
android:src="@drawable/suzumori_park_00125"/>
</RelativeLayout>
ImageView imageView = findViewById(R.id.iv);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//通过加载xml动画设置文件来创建一个animation对象
Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.alpha);
imageView.startAnimation(animation);
}
});
11.属性动画
- ValueAnimator
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f);
//设置动画结束时间
valueAnimator.setDuration(2000);
//设置动画监听
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();
Log.e("tianlog","value:"+value);
}
});
valueAnimator.start();
E/tianlog: value:0.073679864
E/tianlog: value:0.09595364
E/tianlog: value:0.10348278
E/tianlog: value:0.12860283
E/tianlog: value:0.13767341
E/tianlog: value:0.15601262
E/tianlog: value:0.16582394
E/tianlog: value:0.17527595
E/tianlog: value:0.18554324
E/tianlog: value:0.19603491
E/tianlog: value:0.20610732
E/tianlog: value:0.21701273
E/tianlog: value:0.22811979
E/tianlog: value:0.23875079
E/tianlog: value:0.2502268
E/tianlog: value:0.2618809
E/tianlog: value:0.27300477
E/tianlog: value:0.28498077
E/tianlog: value:0.29711008
E/tianlog: value:0.3086583
E/tianlog: value:0.32106042
E/tianlog: value:0.33359015
E/tianlog: value:0.34623873
E/tianlog: value:0.3582433
E/tianlog: value:0.37109637
E/tianlog: value:0.38404122
E/tianlog: value:0.39630032
E/tianlog: value:0.40939718
E/tianlog: value:0.4225586
E/tianlog: value:0.43499652
E/tianlog: value:0.44825655
E/tianlog: value:0.46155345
E/tianlog: value:0.47409347
E/tianlog: value:0.5133501
E/tianlog: value:0.5133501
E/tianlog: value:0.5266908
E/tianlog: value:0.5392295
E/tianlog: value:0.5525245
E/tianlog: value:0.56578225
E/tianlog: value:0.57821715
E/tianlog: value:0.59137523
E/tianlog: value:0.6044678
E/tianlog: value:0.61748624
E/tianlog: value:0.6296624
E/tianlog: value:0.64250964
E/tianlog: value:0.65525526
E/tianlog: value:0.6671502
E/tianlog: value:0.67967266
E/tianlog: value:0.692067
E/tianlog: value:0.70360744
E/tianlog: value:0.715728
E/tianlog: value:0.72769487
E/tianlog: value:0.73880935
E/tianlog: value:0.75045335
E/tianlog: value:0.76191854
E/tianlog: value:0.77253914
E/tianlog: value:0.78363436
E/tianlog: value:0.79452765
E/tianlog: value:0.80458844
E/tianlog: value:0.81506693
E/tianlog: value:0.82532084
E/tianlog: value:0.83475983
E/tianlog: value:0.8445569
E/tianlog: value:0.8541083
E/tianlog: value:0.86286736
E/tianlog: value:0.8719225
E/tianlog: value:0.8807126
E/tianlog: value:0.8887377
E/tianlog: value:0.89699525
E/tianlog: value:0.9049696
E/tianlog: value:0.91221136
E/tianlog: value:0.91962016
E/tianlog: value:0.9267299
E/tianlog: value:0.93314356
E/tianlog: value:0.93965816
E/tianlog: value:0.94585925
E/tianlog: value:0.9514053
E/tianlog: value:0.9569855
E/tianlog: value:0.96223974
E/tianlog: value:0.96688396
E/tianlog: value:0.9714953
E/tianlog: value:0.9757704
E/tianlog: value:0.97948414
E/tianlog: value:0.98309815
E/tianlog: value:0.9863677
E/tianlog: value:0.9891282
E/tianlog: value:0.9917226
E/tianlog: value:0.99396646
E/tianlog: value:0.9957565
E/tianlog: value:0.9973154
E/tianlog: value:0.99851966
E/tianlog: value:0.9993284
E/tianlog: value:0.9998421
E/tianlog: value:1.0
- ObjectAnimator
ImageView imageView = findViewById(R.id.iv);
//让透明度从完全透明到不透明
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView,"alpha",0f,1f);
objectAnimator.setDuration(4000);
objectAnimator.start();
主要是看View控件中有那些属性,有get和set方法的都能够使用。
设置监听
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
//能够让我们只选择一个方法实现
objectAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
}
});
objectAnimator.start();