FrameLayout(幀佈局)


本節引言

FrameLayout(幀佈局)可以說是六大佈局中最為簡單的一個佈局,這個佈局直接在屏幕上開闢出一塊空白的區域,當我們往裡面添加控件的時候,會默認把他們放到這塊區域的左上角,而這種佈局方式卻沒有任何的定位方式,所以它應用的場景並不多;幀佈局的大小由控件中最大的子控件決定,如果控制項的大小一樣大的話,那麼同一時刻就只能看到最上面的那個組件!後續添加的控制項會覆蓋前一個!雖然預設會將控制項放置在左上角,但是我們也可以透過layout_gravity屬性,指定到其他的位置!本節除了給大家演示一個最簡單的例子外,還給大家帶了兩個好玩的例子,有興趣的可以看看!

1.常用屬性

FrameLayout的屬性很少就兩個,但是在說之前我們先介紹一個東西:

前景圖像:永遠處於幀佈局最上面,直接面對用戶的圖像,就是不會被覆蓋的圖片。

兩個屬性:

  • android:foreground:*設定改幀佈局容器的前景圖片

  • android:foregroundGravity:設定前景圖片顯示的位置

#2.實例示範

1)最簡單的範例

執行效果圖:

1.png

實作程式碼如下:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/FrameLayout1"    
    android:layout_width="match_parent"    ##  .MainActivity"     
    android: foreground="@drawable/logo"    
    android:foregroundGravity="right|bottom">    
    
#            android:layout_width="200,       android:background="../style/images/android-tutorial-framelayout. html” //>    
    #        android:layout_width="150dp"    
     android:background="../style/images/android-tutorial-framelayout.html" / >    
             android:layout_width="100dp"    
      android:background="../style/images/android-tutorial-framelayout.html" / >    
        
</FrameLayout>

#

程式碼解析:很簡單,三個TextView設定不同大小與背景色,依序覆蓋,接著右下角的是前景影像,通過 android:foreground="@drawable/logo"設定前景圖片的圖片, android:foregroundGravity="right|bottom"設定前景映像的位置在右下角

2)隨手指移動的萌妹

效果圖如下:

2.gif

實作流程解析:

  • step 1:先將main.xml佈局設定為空白的FrameLayout,為其設定一個圖片背景

  • step 2:新建一個繼承View類別的MeziView自訂元件類別,在建構方法中初始化view的初始座標

  • step 3:重寫onDraw()方法,實例化一個空的畫筆類別Paint

  • step 4:呼叫BitmapFactory.decodeResource()產生位圖物件

  • step 5:調用canvas.drawBitmap()繪製女孩的點陣圖物件

  • step 6:判斷圖片上是否回收,否則強制回收圖片

  • step 7 :在主Java程式碼中取得幀佈局物件,並且實例化一個MeziView類別

  • #step 8:會實例化的mezi物件新增一個觸控事件的監聽器,重寫onTouch方法,改變mezi的X,Y座標,呼叫invalidate()重繪方法

  • #step 9: 將mezi物件加入到幀佈局中

版面碼:main_activity.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    xmlns :tools="http://schemas.android.com/tools"    
    android:id="@+id/mylayout"    
    
    tools:context=".MainActivity"    
    android:background="../style/images/back" >    
#</FrameLayout/back" >    
#</FrameLayout/back" >    
#</FrameLayout/back" >   

自訂的MeziView.java

##package com.jay.example.framelayoutdemo2;  
  
import android.content.Context;  
import android.graphics.Bitmap;  
import android.graphics.BitmapFactory;  
import android.graphics.Canvas;  
import android.graphics.Paint  
import ##public class MeziView extends View {  
    //定義相關變數,依序為妹子顯示位置的X,YX  
    public  public MeziView(Context context) {  
        super(context);  
        //設定妹子的起始座標X  
   = 200;  
    }  
 
    //改寫View類的onDraw()方法  
    @Override  
    protected void onDraw(Canvas canvas) {  ## //建立,且實例化Paint的物件  
        Paint paint = new Paint();  
        //根據圖片產生點陣圖物件  
        Bitmap bitmap      //畫出萌妹  


## canvas.drawBitmap(bitmap, bitmapX, bitmapY,paint);  
        //判斷圖片是否回收,木有回收的話語強制收回圖片  #  )#   {  
            bitmap. recycle();  
        }  
    } 
}








#######################################################################################################################################################################

MainActivity.java:

package com.jay.example.framelayoutdemo2;  
  
#導入android.os.Bundle;  
導入 android.view.MotionEvent;  
導入 android.view.View;  
導入android.view.View.OnTouchListener;  
導入 android.widget.FrameLayout;  
導入android.app.Activity;  
  
#  
public 類 MainActivity 擴充 Activity {  
  
    @Override  
      super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        FrameLayout frame = (FrameLayout) findViewById(R.id.mylayout);  
        最終 MeziView mezi = new MeziView(MainActivity.this);  
        //為我們的女孩新增觸控事件監聽器萌
        mezi.setOnTouchListener(new OnTouchList\           public boolean onTouch(View view, MotionEvent event) {  
          /設定妹子顯示的位置  
                mezi.bitmapX = event.getX() - 150 event.getY() - 150;
               //使用重繪方式  
       。  
        frame.addView(mezi);  
    }  
}

#

程式碼解釋:見步驟,很簡單,就是自訂View類別,重寫重繪方法,接著在Activity中為他添加一個觸控時間在觸控時間中重寫onTouch方法獲取點選焦點,另外還需要-150,不然那個座標是自訂View的左上角,接著呼叫invalidate( )重繪方法,最後加入到幀佈局中而已!

程式碼下載:FrameLayoutDemo2.zip

3)跑動的萌妹

效果圖如下:

3.gif

實作流程:

#step 1:定義一個空的FrameLayout佈局,將前景映像的位置設為中央位置

step 2:在Activity中取得到該FrameLayout佈局,新建一個Handler物件,重寫handlerMessage()方法,呼叫映像- 更新的方法



step 3:自訂一個move()方法,透過switch動態設定前景圖片顯示的點陣圖


step 4:在onCreate()方法中新建一個計時器物件Timer,重寫run方法,每隔170毫秒向handler發送空白訊息
############實作程式碼如下:############佈局文件:main_activity.xml:############<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    ###    xmlns:tools=" http://schemas.android.com/tools"    ####    android:id="@+id/myframe"    ####    android ###    android :foregroundGravity="center">    ###</FrameLayout>######

MainActivity.java:

#

package com.jay.example.framelayoutdemo3;    
    
import java.util.Timer;    
import .util.util.Timer;    
import ;    
import android.os.Handler;    
import android.os.Message;    
import android.view.View;   .FrameLayout;    
import android.app.Activity;    
import android.graphics.drawable.Drawable;    
  //初始化變數,幀佈局    

## FrameLayout frame = null;    
    //自訂一個用於定時更新UI介面的handler類別物件    
      {    
            int i = 0;    
       
            public void handleMessage(Message msg) {    
               if(msg.what == 0x123)    
                 i++;    
                    move( i % 8 );    
                }    
                 }    則以







》        };          
            
#    //在使用圖片中切換的方法    
     •  Drawable a = getResources().getDrawable(R.drawable.s_1);    
        Drawable b = getResources().getDrawable(R.drawable.s_2);    
        Drawable c = getResources().getDrawable(R.drawable.s_3);    
        Drawable d = getResources().getDrawable(R.drawable.s_4);    
        Drawable e = getResources().getDrawable(R.drawable.s_5);    
        Drawable f = getResources().getDrawable(R.drawable.s_6);    
        Drawable g = getResources().getDrawable(R.drawable.s_7);    
        Drawable h = getResources().getDrawable(R.drawable.s_8);    
        //透過setForeground設定前景影像    
        switch(i)    ) case 0:    
                frame.setForeground(a);    ### 休息;    
            個案 1:    
                frame.setForeground(b);    ### 休息;    
            個案2:    
                frame.setForeground(c);    
                休息;    
            個案 3:    
                frame.setForeground(d);    ### 休息;    
            案例 4:    
                 對中使用);    ### 休息;    
            個案 5:    
                frame.setground(f);    ### 休息;    
            個案 6:    
                frame.setground(g);    ### 休息;    
            個案 7:    
                frame.set11(h);    ### 休息;    
        }    
    }    
        
  stanceState) {    
        super.onCreate(savedInstanceState);    
        setContentView(R.layout.activity_main);    
            
        frame = (FrameLayout) findViewById(R.id.myframe);    
//定義一個定時器對象,定時發送信息給handler    
        new Timer().schedule(new TimerTask() {    
                
            @Override    
            public void run() {    
                //寄一空訊息通知系統改變前景圖片    
                handler.sendEmptyMessage(0x123)  #       }, 0,170);     
    }    
#}


################################################################################################################# ###########程式碼解析:###程式碼也很簡單,就是定義一個handler物件來刷新幀佈局的前景映像,定義一個Timer定時器每隔170毫秒發送定時資訊,i++; move(i%8);這裡是因為我們使用8張圖片作為動畫素材! #########程式碼下載:###FrameLayoutDemo3.zip######本節小結######本節介紹了下FrameLayout(幀佈局),主要掌握foreground和foregroundGravity屬性的使用即可!幀佈局比前面的表格佈局用得稍微多一點!有興趣可以像筆者這樣寫點小例子試試看! ########## ###