新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Android系統(tǒng)開發(fā)全攻略(二)

Android系統(tǒng)開發(fā)全攻略(二)

作者: 時(shí)間:2012-06-08 來源:網(wǎng)絡(luò) 收藏

  public Panel(Context context,View otherView,int width,int height) {

  super(context);

  this.mContext=context;

  //改變Panel附近組件的屬性

  LayoutParams otherLP=(LayoutParams) otherView.getLayoutParams();

  otherLP.weight=1;//支持壓擠

  otherView.setLayoutParams(otherLP);

  //設(shè)置Panel本身的屬性

  LayoutParams lp=new LayoutParams(width, height);

  lp.rightMargin=-lp.width+HANDLE_WIDTH;//Panel的Container在屏幕不可視區(qū)域,Handle在可視區(qū)域

  mRightMargin=Math.abs(lp.rightMargin);

  this.setLayoutParams(lp);

  this.setOrientation(LinearLayout.HORIZONTAL);

  //設(shè)置Handle的屬性

  btnHandle=new Button(context);

  btnHandle.setLayoutParams(new LayoutParams(HANDLE_WIDTH,height));

  btnHandle.setOnClickListener(new OnClickListener(){

  @Override

  public void onClick(View arg0) {

  LayoutParams lp = (LayoutParams) Panel.this.getLayoutParams();

  if (lp.rightMargin 《 0)// CLOSE的狀態(tài)

  new AsynMove().execute(new Integer[] { MOVE_WIDTH });// 正數(shù)展開

  else if (lp.rightMargin 》= 0)// OPEN的狀態(tài)

  new AsynMove().execute(new Integer[] { -MOVE_WIDTH });// 負(fù)數(shù)收縮

  }

  });

  //btnHandle.setOnTouchListener(HandleTouchEvent);

  this.addView(btnHandle);

  //設(shè)置Container的屬性

  panelContainer=new LinearLayout(context);

  panelContainer.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,

  LayoutParams.FILL_PARENT));

  this.addView(panelContainer);

  }

  /**
  * 定義收縮時(shí)的回調(diào)函數(shù)

  * @param event

  */

  public void setPanelClosedEvent(PanelClosedEvent event)

  {

  this.panelClosedEvent=event;

  }

  /**

  * 定義展開時(shí)的回調(diào)函數(shù)

  * @param event

  */

  public void setPanelOpenedEvent(PanelOpenedEvent event)

  {

  this.panelOpenedEvent=event;

  }

  /**

  * 把View放在Panel的Container

  * @param v

  */

  public void fillPanelContainer(View v)

  {

  panelContainer.addView(v);

  }

/**

  * 異步移動(dòng)Panel

  * @author hellogv

  */

  class AsynMove extends AsyncTask《Integer, Integer, Void》 {

  @Override

  protected Void doInBackground(Integer.。. params) {

  int times;

  if (mRightMargin % Math.abs(params[0]) == 0)// 整除

  times = mRightMargin / Math.abs(params[0]);

  else

  // 有余數(shù)

  times = mRightMargin / Math.abs(params[0]) + 1;

  for (int i = 0; i 《 times; i++) {

  publishProgress(params);

  try {

  Thread.sleep(Math.abs(params[0]));

  } catch (InterruptedException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  return null;

  }

  @Override

  protected void onProgressUpdate(Integer.。. params) {

  LayoutParams lp = (LayoutParams) Panel.this.getLayoutParams();

  if (params[0] 《 0)

  lp.rightMargin = Math.max(lp.rightMargin + params[0],

 ?。?mRightMargin));

  else

  lp.rightMargin = Math.min(lp.rightMargin + params[0], 0);

  if(lp.rightMargin==0 panelOpenedEvent!=null){//展開之后

  panelOpenedEvent.onPanelOpened(Panel.this);//調(diào)用OPEN回調(diào)函數(shù)

  }

  else if(lp.rightMargin==-(mRightMargin) panelClosedEvent!=null){//收縮之后

  panelClosedEvent.onPanelClosed(Panel.this);//調(diào)用CLOSE回調(diào)函數(shù)

  }

  Panel.this.setLayoutParams(lp);

  }

  }

  }

  《/span》

  《span style=“font-family:Comic Sans MS;font-size:18px;”》public class Panel extends LinearLayout{

  public interface PanelClosedEvent {

  void onPanelClosed(View panel);

  }

  public interface PanelOpenedEvent {

  void onPanelOpened(View panel);

  }

  /**Handle的寬度,與Panel等高*/

  private final static int HANDLE_WIDTH=30;

  /**每次自動(dòng)展開/收縮的范圍*/

  private final static int MOVE_WIDTH=20;

  private Button btnHandle;

  private LinearLayout panelContainer;

  private int mRightMargin=0;

  private Context mContext;

  private PanelClosedEvent panelClosedEvent=null;

  private PanelOpenedEvent panelOpenedEvent=null;

  /**

  * otherView自動(dòng)布局以適應(yīng)Panel展開/收縮的空間變化

  * @author GV

  *

  */

  public Panel(Context context,View otherView,int width,int height) {

  super(context);

  this.mContext=context;

  //改變Panel附近組件的屬性

  LayoutParams otherLP=(LayoutParams) otherView.getLayoutParams();

  otherLP.weight=1;//支持壓擠

  otherView.setLayoutParams(otherLP);

  //設(shè)置Panel本身的屬性

  LayoutParams lp=new LayoutParams(width, height);

  lp.rightMargin=-lp.width+HANDLE_WIDTH;//Panel的Container在屏幕不可視區(qū)域,Handle在可視區(qū)域

  mRightMargin=Math.abs(lp.rightMargin);

  this.setLayoutParams(lp);

  this.setOrientation(LinearLayout.HORIZONTAL);

  //設(shè)置Handle的屬性

  btnHandle=new Button(context);

  btnHandle.setLayoutParams(new LayoutParams(HANDLE_WIDTH,height));

  btnHandle.setOnClickListener(new OnClickListener(){

  @Override

  public void onClick(View arg0) {

  LayoutParams lp = (LayoutParams) Panel.this.getLayoutParams();

  if (lp.rightMargin 《 0)// CLOSE的狀態(tài)

  new AsynMove().execute(new Integer[] { MOVE_WIDTH });// 正數(shù)展開

  else if (lp.rightMargin 》= 0)// OPEN的狀態(tài)

  new AsynMove().execute(new Integer[] { -MOVE_WIDTH });// 負(fù)數(shù)收縮

  }

  });

  //btnHandle.setOnTouchListener(HandleTouchEvent);

  this.addView(btnHandle);

  //設(shè)置Container的屬性

  panelContainer=new LinearLayout(context);

  panelContainer.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,

  LayoutParams.FILL_PARENT));

  this.addView(panelContainer);

  }

  /**

  * 定義收縮時(shí)的回調(diào)函數(shù)

  * @param event

  */

  public void setPanelClosedEvent(PanelClosedEvent event)

  {

  this.panelClosedEvent=event;

  }

  /**

  * 定義展開時(shí)的回調(diào)函數(shù)

  * @param event

  */

  public void setPanelOpenedEvent(PanelOpenedEvent event)

  {

  this.panelOpenedEvent=event;

  }

  /**

  * 把View放在Panel的Container

  * @param v

  */

  public void fillPanelContainer(View v)

  {

  panelContainer.addView(v);

  }

  /**

  * 異步移動(dòng)Panel

  * @author hellogv

  */

  class AsynMove extends AsyncTask《Integer, Integer, Void》 {

  @Override

  protected Void doInBackground(Integer.。. params) {

  int times;

  if (mRightMargin % Math.abs(params[0]) == 0)// 整除

  times = mRightMargin / Math.abs(params[0]);

  else

  // 有余數(shù)

  times = mRightMargin / Math.abs(params[0]) + 1;

  for (int i = 0; i 《 times; i++) {

  publishProgress(params);

  try {

  Thread.sleep(Math.abs(params[0]));

  } catch (InterruptedException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  return null;

  }

  @Override

  protected void onProgressUpdate(Integer.。. params) {

  LayoutParams lp = (LayoutParams) Panel.this.getLayoutParams();

  if (params[0] 《 0)

  lp.rightMargin = Math.max(lp.rightMargin + params[0],

  (-mRightMargin));

  else

  lp.rightMargin = Math.min(lp.rightMargin + params[0], 0);

  if(lp.rightMargin==0 panelOpenedEvent!=null){//展開之后

  panelOpenedEvent.onPanelOpened(Panel.this);//調(diào)用OPEN回調(diào)函數(shù)

  }

  else if(lp.rightMargin==-(mRightMargin) panelClosedEvent!=null){//收縮之后

  panelClosedEvent.onPanelClosed(Panel.this);//調(diào)用CLOSE回調(diào)函數(shù)

  }

  Panel.this.setLayoutParams(lp);

  }

  }

  }

  《/span》

  main.java是主控部分,演示了Panel的使用:

 ?。踛ava] view plaincopyprint?

  《span style=“font-family:Comic Sans MS;font-size:18px;”》public class main extends Activity {

  public Panel panel;

  public LinearLayout container;

  public GridView gridview;

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  this.setTitle(““可動(dòng)態(tài)布局”的抽屜組件之構(gòu)建基礎(chǔ)-----hellogv”);

  gridview = (GridView) findViewById(R.id.gridview);

  container=(LinearLayout)findViewById(R.id.container);

  panel=new Panel(this,gridview,200,LayoutParams.FILL_PARENT);

  container.addView(panel);//加入Panel控件

  //新建測試組件

  TextView tvTest=new TextView(this);

  tvTest.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));

  tvTest.setText(“測試組件,紅字白底”);

  tvTest.setTextColor(Color.RED);

  tvTest.setBackgroundColor(Color.WHITE);

  //加入到Panel里面

  panel.fillPanelContainer(tvTest);

  panel.setPanelClosedEvent(panelClosedEvent);

  panel.setPanelOpenedEvent(panelOpenedEvent);

  //往GridView填充測試數(shù)據(jù)

  ArrayList《HashMap《String, Object》》 lstImageItem = new ArrayList《HashMap《String, Object》》();

  for (int i = 0; i 《 100; i++) {

  HashMap《String, Object》 map = new HashMap《String, Object》();

  map.put(“ItemImage”, R.drawable.icon);

  map.put(“ItemText”, “NO.” + String.valueOf(i));

  lstImageItem.add(map);

  }

  SimpleAdapter saImageItems = new SimpleAdapter(this,

  lstImageItem,

  R.layout.item,

  new String[] { “ItemImage”, “ItemText” },

  new int[] { R.id.ItemImage, R.id.ItemText });

  gridview.setAdapter(saImageItems);

  gridview.setOnItemClickListener(new ItemClickListener());

  }

  PanelClosedEvent panelClosedEvent =new PanelClosedEvent(){

  @Override

  public void onPanelClosed(View panel) {

  Log.e(“panelClosedEvent”,“panelClosedEvent”);

  }

  };

  PanelOpenedEvent panelOpenedEvent =new PanelOpenedEvent(){

  @Override

  public void onPanelOpened(View panel) {

  Log.e(“panelOpenedEvent”,“panelOpenedEvent”);

  }

  };

  class ItemClickListener implements OnItemClickListener {

  @Override

  public void onItemClick(AdapterView《?》 arg0,View arg1, int arg2, long arg3) {

  @SuppressWarnings(“unchecked”)

  HashMap《String, Object》 item = (HashMap《String, Object》) arg0

  .getItemAtPosition(arg2);

  setTitle((String) item.get(“ItemText”));

  }

  }《/span》

  這次就在基礎(chǔ)篇的基礎(chǔ)上加入拖拉功能。拖拉功能基于GestureDetector,GestureDetector的基本使用方式不是本文介紹的重點(diǎn),有興趣的童鞋可以上網(wǎng)查詢相關(guān)的教程。

本文的抽屜控件相對(duì)于基礎(chǔ)篇的抽屜控件多了以下功能:

  1.支持手勢拖拉

  2.拖拉到一半時(shí),可以自動(dòng)展開或者收縮。

  具體如下圖:

  這次就在基礎(chǔ)篇的基礎(chǔ)上加入拖拉功能。拖拉功能基于GestureDetector,GestureDetector的基本使用方式

  本文的源碼可以到這里下載:http://download.csdn.net/detail/hellogv/3642418



評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉