更多介紹:http://www.google.com/patents/CN103336691A?cl=zh java
一種基於Android的動態佈局和管理的實現方法 ide
技術領域 佈局
本實用新型涉及到一種在嵌入式平臺上動態生成、銷燬控件及動態改變位置的方法,尤爲涉及Android平臺的經過自定義的XML或INI配置文件動態佈局方法。 字體
背景技術 this
爲了更好地管理Android應用的用戶界面裏面的各個組件,Android提供了佈局管理器,使各個組件能在不一樣的設備的屏幕上都能運行良好,如今Android共有線性佈局(LinearLayout)、表格佈局(TableLayout)、幀佈局(FrameLayout)相對佈局(RelativeLayout)和絕對佈局(AbsoluteLayout)5種佈局。 google
可是這5中佈局方式都是預先經過代碼或者在XML佈局文件中定義好各個界面的佈局方式,佈局肯定之後若是發如今某設備的顯示效果很差只能是技術人員去修改相關的代碼以適應之,用戶不可以再改變界面上控件的個數、位置和大小。可是有時候咱們須要在一臺管理機上管理不少設備終端,(好比廣告機,這些設備終端播放着視頻、圖片和滾動的字面等多媒體信息),這些設備終端的分辨率和寬高比例大部分狀況都是不一樣的,須要顯示的內容在每個時刻也是不一樣的, spa
管理員須要根據終端設備配備屏幕參數的不一樣和須要展現的內容的不一樣編排節目內容,管理軟件採用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 int x;
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 int rollSpeed; // 滾動速動
private int fontSize; // 字體大小
private int charSpace; // 字符間距
private int rowSpace; // 行間距
private int foregroundColor;// 前景色
private int backgroundColor;// 背景色
private Vector<String> txt; // 顯示文本
private Vector<integer> times; //
}