Android 動態佈局 動態生成 銷燬控制元件 改變控制元件的位置等

yangxi_001發表於2013-11-28

一種基於Android的動態佈局和管理的實現方法

技術領域

  本實用新型涉及到一種在嵌入式平臺上動態生成、銷燬控制元件及動態改變位置的方法,尤其涉及Android平臺的通過自定義的XMLINI配置檔案動態佈局方法。

背景技術

為了更好地管理Android應用的使用者介面裡面的各個元件,Android提供了佈局管理器,使各個元件能在不同的裝置的螢幕上都能執行良好,現在Android共有線性佈局(LinearLayout)、表格佈局(TableLayout)、幀佈局(FrameLayout)相對佈局(RelativeLayout)和絕對佈局(AbsoluteLayout5種佈局。

但是這5中佈局方式都是預先通過程式碼或者在XML佈局檔案中定義好各個介面的佈局方式,佈局確定以後如果發現在某裝置的顯示效果不好只能是技術人員去修改相關的程式碼以適應之,使用者不能夠再改變介面上控制元件的個數、位置和大小。但是有時候我們需要在一臺管理機上管理很多裝置終端,(比如廣告機,這些裝置終端播放著視訊、圖片和滾動的字面等多媒體資訊),這些裝置終端的解析度和寬高比例大部分情況都是不同的,需要顯示的內容在每一個時刻也是不同的,

管理員需要根據終端裝置配備螢幕引數的不同和需要展示的內容的不同編排節目內容,管理軟體採用Android 現有的佈局管理器都無法很好的滿足要求,無法根據需要顯示的內容和裝置終端的螢幕屬性來動態佈局,動態管理。

發明內容

    本實用新型的目的是為了方便Android裝置的使用者能夠根據不同裝置終端的螢幕屬性和展示內容的不同來動態的為生成元件指定大小、位置,並能動態的新增新的元件、刪除或替換已有元件,即能在執行前或者在執行的過程中增、刪、改變控制元件的屬性以及重新佈局。

技術方案

為了能夠動態的佈局,我們首先會讓終端操控者知道終端顯示裝置的解析度,寬高比例等基本的引數,以便其能夠編輯介面的佈局情況。

終端操控者編輯完佈局情況預覽確認後會形成佈局配置檔案,分為兩種情況:如果在本地操作會形成XML佈局配置檔案,反之如果在遠端PC等管理端則會形成INI佈局配置檔案。

終端APK接收到確認佈局命令後,佈局解析器會解析獲取到的XML或者INI佈局配置檔案,配置檔案中會包含控制元件的型別、個數、位置和大小等基本的資訊,然後封轉成為java類物件,從這個物件中程式可以獲知某種型別的控制元件的個數,在螢幕上的位置、大小和其他構造這種控制元件所需要的額外資訊,不同控制元件所需要的額外資訊一般來說是不同的。

當所有的資訊都以類物件的形式封裝好後,動態佈局管理器就會開始在終端裝置上佈局。

在執行的過程中可以動態的(疊加)插入新的控制元件,也可以對已有的控制元件進行佈局修改。

本發明所述的方法需要通過如下幾個步驟來具體的實施:

   結合圖1 所示,動態佈局的步驟如下:

1、如果終端操控者不在本地操作,則先獲取終端顯示裝置的基本屬性。

        Display display = getWindowManager().getDefaultDisplay();

      screenHeight = display.getHeight();     //獲取螢幕的高

 screenWidth = display.getWidth();      //獲取螢幕的寬

    然後計算出寬高比後傳送引數到遠端操控端

2、如果終端操控者在本地則在本地編輯介面佈局,在遠端則通過獲取的螢幕引數模擬終端顯示裝置來編輯佈局,終端操控者通過滑鼠、觸控式螢幕等輸入裝置自定義在終端顯示裝置的不同區域顯示不同的控制元件和控制元件的大小、位置、背景、背景透明度以及疊加顯示的層次結構和構造本控制元件需要的其他額外資訊。

   在編輯的過程中可以通過預覽看見基本的佈局情況,確認提交後,根據不同的操控平臺會形成INI或者XML等基本的配置檔案,配置檔案的結構資訊如附圖2和附圖3.

3、終端裝置收到INI或者XML佈局確認配置檔案後,佈局解析器會把佈局配置檔案中的內容解析封裝成為java佈局類物件,佈局類UML圖見附圖4.

4、裝置終端的軟體根據配置檔案的資訊結合Android已經有的絕對佈局管理器生成所需要的控制元件並顯示之。

……

layoutManger =new AbsoluteLayout(this);     //定義佈局管理器

setContentView(layoutManger);  //在檢視中的內容都交給佈局管理器控制

……

LayoutData layoutdata;                     //佈局資訊

Void setLayout(){     

   initdata.getInitHead()            //獲取ini資料頭

  if(0!=iniHead.play_obj_num)             //視訊物件只有一個

               videoView=new VideoSurfaceView(this,src);

                videoViewLp=new AbsoluteLayout.LayoutParams

(playInfo.width, playInfo.height, playInfo.x, playInfo.y);

                layoutManger.addView(videoView, videoViewLp);

                break;

   if(0!=iniHead.grap_obj_num){    //影象物件可能會有多

pictureView[ ]= new Array<pictureView>[.grap_obj_num]

                for(int i=0;i< iniHead.grap_obj_num;i++){

                pictureView[i]=new pictureView(this,src);

              pictureViewLp=new AbsoluteLayout.LayoutParams

(picInfo.width, picInfo..height, picInfo.x, picInfo..y);

                layoutManger.addView(pictureView, pictureViewLp);

                //pictureView 物件集合

                }

   }

                break;

其他的控制元件佈局設定

}

5、執行的過程中在本地或者遠端控制端通過修改佈局配置檔案動態的修改顯示的內容,對某一個控制元件的佈局進行修改

新的佈局引數=(AbsoluteLayout.LayoutParams)控制元件名稱.getLayoutParams();

新的佈局引數=.x=100;

新的佈局引數=.y=100;

新的佈局引數=.width=900;

新的佈局引數=.height=500;                   

控制元件名稱.setLayoutParams(新的佈局引數);


附圖說明

1 :動態佈局流程圖

2 INI佈局檔案內容與結構圖

3 XML佈局檔案內容與結構圖

4 java佈局類物件UML類圖


附件: Layout 類內容與結構

public class LayoutData {

   private LayoutHead head;

   private LayoutPlayInfo playInfo;

   private List<LayoutPicInfo>  picInfoList;

   private List<LayoutTextInfo>  textInfoList;

   private Layout其他控制元件Info 其他控制元件Info;

   public class LayoutHead{

       private int playObjNum;         //    視訊物件數

       private int grapObjNum;          //     影象物件數

       private int textObjNum;          //     文字物件數

       private int dateObjEnable;   //     日期物件啟用

       private int timeObjEnable;   //     時間物件啟用

       private int wdayObjEnable;     //     星期物件啟用

   }

  

   public class LayoutPlayInfo{

       private int enable;          //有效標誌,設為1有效

       private int playmode;         //播放模式,0-迴圈播放,1-隨機播放     private intx;           

       private int y;              

       private Vector<String> src;               

private Vector<String> netPath;     //格式

   }

  

   public class LayoutPicInfo{

       private int enable;    //           有效標誌,設為1有效

       private int x;           

       private int y;           

       private int width;    

       private int height;   

       private int displayTimes;//         每張圖片的顯示時間(秒)

       private int picSpecial;      //        特效模式

       private int specialStep;  //        特效速度

       private Vector<String> src;     

       private Vector<String> get; 

   }

      public class LayoutTextInfo{

       private int enable;        //     有效標誌,設為1有效

       private int x;            //     左邊x值,以OSD寬度的比例計算

       private int y;            //     上邊y值,以OSD高度的比例計算

       private int width;         //     寬度,以OSD寬度的比例計算

       private int height;        //     高度,以OSD高度的比例計算

       private int displayMode;    //   顯示方式,如從右到左滾動   private introllSpeed;    //        滾動速動

       private int fontSize;     //        字型大小

       private int charSpace;     //        字元間距

       private int rowSpace;     //        行間距

       private int foregroundColor;//      前景色

       private int backgroundColor;//      背景色

       private Vector<String>  txt;            //        顯示文字

       private Vector<integer> times;                //

}

相關文章