Android 开发 (布局和动画)
Android 开发 (布局和动画)
LinearLayout
属性
orientation 布局中组件的排列方式
gravity 控制组件所包含的子元素的对其方式可多个组合
layout_gravity 控制该组件在父容器里的对其方式
background 为组件设置一个背景图片 或者是直接用颜色覆盖
divider 分割线
showDividers 设置分割线所在的位置 none(无) beginning(开始) end(结束) middle(每两个组件间)
dividerPaddding 设置分割线的padding(边距)
layout_weight (权重) 该属性是用来等比列划分区域
RelaticeLayout(相对布局)
常见属性
根据父容器定位
layout_alignPatenLeft 左对齐
layout_alignParentRight 右对齐
layout_alignParentTop 顶部对齐
layout_alignParentBottom 底部对齐
layout_centerHorizontal 水平居中
layout_centerVertical 垂直居中
layout_centerParent 中间位置
根据兄弟组件定位
layout_toLeftOf 放置于参考组件的左边
layout_toRightOf 放置于参考组件的右边
layout_above 放置参考组件的上方
layout_below 放置参开组件下方
layout_alignTop 对齐参开组件的上边界
layout_alignBottom 对齐参考组件的下边界
layout_alignLeft 对齐参考组件的左边界
layout_alignRight 对齐参考组件的右边界
同用属性
margin 设置组件与父容器的边距
layout_margin 上下左右偏移
layout_marginLeft
layout_marginRight
layout_marginTop
layout_marginBottom
padding 设置组件内部元素的边距
FrameLayout(帧布局)
从页面左上角 开始
常见属性
foreground 设置前景
foregroundGravity 设置前景位置
TableLayout(表格布局)
TableRow 一行
<?xml version="1.0" encoding="utf-8"?>
<TableLayout android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- <TableRow> 一行-->
<TableRow>
<Button
android:text="one"
/>
<Button
android:text="one"
/>
<Button
android:text="one"
/>
<Button
android:text="one"
/>
</TableRow>
<Button
android:text="one"
/>
</TableLayout>
常用属性
collapseColumns 设置需要被隐藏的列的序号 从0开始
stretchColumns 设置允许被拉升的列的列序号 从0开始
shrinkColumns 设置允许被收缩的列的列序号 从0开始
子控件设置属性
layout_column 显示在第几列
layout_span 横向跨几列
GridLayout(网格布局)
常用属性
orientation 设置水平显示还是垂直显示
columnCount 设置行的显示个数
rowCount 设置列的显示个数
子控件属性
layout_column 显示在第几列
layout_collumnSpan 横向跨几列
layout_columnWeight 横向剩余空间分配方式
layout_gravity 在网格的显示位置
layout_row 显示在第几行
layout_rowSpan 横向跨几行
layout_rowWeight 总线剩余空间分配方式
ConstraintLayout(约束布局)
ListView
使用默认的适配器
创建一个list_view 容器
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/list_view"
></ListView>
</LinearLayout>
生成ArrayAdapter 把适配器放入容器
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_view);
//容器 适配器 数据
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,data);
ListView viewById = findViewById(R.id.list_view);
viewById.setAdapter(adapter);
动画
帧动画
帧动画就是顺序播放一组预先定义好的图片,就类似于我们观看视频,就是一张一张的图片连续播放。
放入图片在 drawable文件夹中
创建frame_animation文件
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/image01" android:duration="500"/>
<item android:drawable="@drawable/image02" android:duration="500"/>
<item android:drawable="@drawable/image03" android:duration="500"/>
</animation-list>
使用AnimationDrawable 播放
Button button = (Button) findViewById(R.id.bt_001);
button.setBackgroundResource(R.drawable.frame_animation);//把Drawable设置为button的背景
//拿到这个我们定义的Drawable,实际也就是AnimationDrawable
AnimationDrawable animationDrawable = (AnimationDrawable) button.getBackground();
animationDrawable.start();//开启动画
补间动画
设定它开始和结束的位置,中间的view会自动由系统补齐,而不需要帧动画每一幅图都是提前准备好的。
主要支持四种效果:平移、缩放、旋转、透明度变化(渐变) 四种基本效果
名称 | 标签 | 子类 | 效果 |
---|---|---|---|
平移 | TranslateAnimation | 移动view | |
缩放动画 | ScaleAnimation | 放大或缩小view | |
旋转动画 | RotateAnimation | 旋转view | |
透明度 | AlphaAnimation | 改变view透明度 |
在res目录下创建anim目录
平移
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="100"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="0"/>
缩放
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.0"
android:toYScale="1.0"/>
旋转
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegree="0"
android:toDegree="1800"
android:pivotX = "50%"
android:pivotY="50%"
android:duration = "3000"
/>
渐变
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromAlpha="1.0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator" 表示动画插值器, 可以控制动画的变化速率
android:toAlpha="0.0" />
组合动画
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
>
<scale
android:duration="3000"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.0"
android:toYScale="1.0"/>
<alpha
android:duration="3000"
android:fromAlpha="1.0"
android:toAlpha="0.5" />
<rotate
android:fromDegrees="0"
android:toDegrees="720"
android:pivotX = "50%"
android:pivotY="50%"
android:duration = "3000"
/>
<translate
android:fromXDelta="0"
android:toXDelta="100"
android:fromYDelta="0"
android:toYDelta="100" />
</set>
动画监听
Animation.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animation animation) {
//动画开始时执行
}
@Override
public void onAnimationRepeat(Animation animation) {
//动画重复时执行
}
@Override
public void onAnimationCancel()(Animation animation) {
//动画取消时执行
}
@Override
public void onAnimationEnd(Animation animation) {
//动画结束时执行
}
});
属性动画
属性动画和补间动画的区别
- 补间动画只能定义两个关键帧在透明、旋转、位移和倾斜这四个属性的变换,但是属性动画可以定义任何属性的变化。
- 补间动画只能对 UI 组件执行动画,但属性动画可以对任何对象执行动画
创建定义属性动画,有两种方式
- 使用 ValueAnimator 或者 ObjectAnimator 的静态工厂方法创建动画。
- 使用资源文件来定义动画。
属性
动画持续时间。默认为 300ms,可以通过 android:duration 属性指定。
动画插值方式。通过 android:interploator 指定。
动画重复次数。通过 android:repeatCount 指定。
重复行为。通过 android:repeatMode 指定。
动画集。在属性资源文件中通过 <set …/> 来组合
属性动画 API
Animator: 提供创建属性动画的基类,基本不会直接使用这个类。
ValueAnimator:属性动画用到的主要的时间引擎,负责计算各个帧的属性值,基本上其他属性动画都会直接或间接继承它;
ObjectAnimator: ValueAnimator 的子类,对指定对象的属性执行动画。
AnimatorSet:Animator 的子类,用于组合多个 Animator。
Evaluator ,用来控制属性动画如何计算属性值。
- IntEvaluator:计算 int 类型属性值的计算器。
- FloatEvaluator: 用于计算 float 类型属性值的计算器。
- ArgbEvaluator: 用于计算十六进制形式表示的颜色值的计算器。
- TypeEvaluator: 可以自定义计算器。
ViewPager
在主文件中 写入
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context="com.example.testviewpage_1.MainActivity" >
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</RelativeLayout>
在layout中创建多个 滑动页面 (示例)
<?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:background="#ffffff"
android:orientation="vertical" >
</LinearLayout>
MainActivity 类
package com.example.testviewpage_1;
/**
* @author harvic
* @date 2014.8.9
*/
import java.util.ArrayList;
import java.util.List;
import java.util.zip.Inflater;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class MainActivity extends Activity {
private View view1, view2, view3;
private ViewPager viewPager; //对应的viewPager
private List<View> viewList;//view数组
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager) findViewById(R.id.viewpager);
LayoutInflater inflater=getLayoutInflater();
view1 = inflater.inflate(R.layout.layout1, null);
view2 = inflater.inflate(R.layout.layout2,null);
view3 = inflater.inflate(R.layout.layout3, null);
viewList = new ArrayList<View>();// 将要分页显示的View装入数组中
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);
//PageAdapter——PageView的适配器
PagerAdapter pagerAdapter = new PagerAdapter() {
@Override
//
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
}
@Override
//返回要滑动的VIew的个数
public int getCount() {
// TODO Auto-generated method stub
return viewList.size();
}
@Override
//从当前container中删除指定位置(position)的View
public void destroyItem(ViewGroup container, int position,
Object object) {
// TODO Auto-generated method stub
container.removeView(viewList.get(position));
}
@Override
//将当前视图添加到container中,并返回当前View
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
container.addView(viewList.get(position));
return viewList.get(position);
}
};
viewPager.setAdapter(pagerAdapter);
}
}