1. 程式人生 > 其它 >Android 開發 (佈局和動畫)

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);
		
    }
 
 
}