新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Android系統開發全攻略(二)

        Android系統開發全攻略(二)

        作者: 時間:2012-06-08 來源:網絡 收藏

          只貼出抽屜組件的源碼,其他源文件與基礎篇的一樣:

          [java] view plaincopyprint?

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

          public interface PanelClosedEvent {

          void onPanelClosed(View panel);

          }

          public interface PanelOpenedEvent {

          void onPanelOpened(View panel);

          }

          private final static int HANDLE_WIDTH=30;

          private final static int MOVE_WIDTH=20;

          private Button btnHandler;

          private LinearLayout panelContainer;

          private int mRightMargin=0;

          private Context mContext;

          private GestureDetector mGestureDetector;

          private boolean mIsScrolling=false;

          private float mScrollX;

          private PanelClosedEvent panelClosedEvent=null;

          private PanelOpenedEvent panelOpenedEvent=null;

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

          super(context);

          this.mContext=context;

          //定義手勢識別

          mGestureDetector = new GestureDetector(mContext,this);

          mGestureDetector.setIsLongpressEnabled(false);

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

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

          otherLP.weight=1;

          otherView.setLayoutParams(otherLP);

          //設置Panel本身的屬性

          LayoutParams lp=new LayoutParams(width, height);

          lp.rightMargin=-lp.width+HANDLE_WIDTH;

          mRightMargin=Math.abs(lp.rightMargin);

          this.setLayoutParams(lp);

          this.setOrientation(LinearLayout.HORIZONTAL);

          //設置Handler的屬性

          btnHandler=new Button(context);

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

          //btnHandler.setOnClickListener(handlerClickEvent);

          btnHandler.setOnTouchListener(handlerTouchEvent);

          this.addView(btnHandler);

          //設置Container的屬性

          panelContainer=new LinearLayout(context);

          panelContainer.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,

          LayoutParams.FILL_PARENT));

          this.addView(panelContainer);

          }

          private View.OnTouchListener handlerTouchEvent=new View.OnTouchListener() {

          @Override

          public boolean onTouch(View v, MotionEvent event) {

          if(event.getAction()==MotionEvent.ACTION_UP //onScroll時的ACTION_UP

          mIsScrolling==true)

          {

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

          if (lp.rightMargin 》= (-mRightMargin/2)) {//往左超過一半

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

          }

          else if (lp.rightMargin 《 (-mRightMargin/2)) {//往右拖拉

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

          }

          }

          return mGestureDetector.onTouchEvent(event);

          }

          };

          /**

          * 定義收縮時的回調函數

          * @param event

          */

          public void setPanelClosedEvent(PanelClosedEvent event)

          {

          this.panelClosedEvent=event;

          }

          /**

          * 定義展開時的回調函數

          * @param event

          */

          public void setPanelOpenedEvent(PanelOpenedEvent event)

          {

          this.panelOpenedEvent=event;

          }

          /**

          * 把View放在Panel的Container

          * @param v

          */

          public void fillPanelContainer(View v)

          {

          panelContainer.addView(v);

          }

          /**

          * 異步移動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

          // 有余數

          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);//調用OPEN回調函數

          }

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

          panelClosedEvent.onPanelClosed(Panel.this);//調用CLOSE回調函數

          }

          Panel.this.setLayoutParams(lp);

          }

          }

          @Override

          public boolean onDown(MotionEvent e) {

          mScrollX=0;

          mIsScrolling=false;

          return false;

          }

          @Override

          public boolean onSingleTapUp(MotionEvent e) {

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

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

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

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

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

          return false;

          }

          @Override

          public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,

          float distanceY) {

          mIsScrolling=true;

          mScrollX+=distanceX;

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

          if (lp.rightMargin 《 -1 mScrollX 》 0) {//往左拖拉

          lp.rightMargin = Math.min((lp.rightMargin + (int) mScrollX),0);

          Panel.this.setLayoutParams(lp);

          Log.e(“onScroll”,lp.rightMargin+“”);

          }

          else if (lp.rightMargin 》 -(mRightMargin) mScrollX 《 0) {//往右拖拉

          lp.rightMargin = Math.max((lp.rightMargin + (int) mScrollX),-mRightMargin);

          Panel.this.setLayoutParams(lp);

          }

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

          panelOpenedEvent.onPanelOpened(Panel.this);//調用OPEN回調函數

          }

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

          panelClosedEvent.onPanelClosed(Panel.this);//調用CLOSE回調函數

          }

          Log.e(“onScroll”,lp.rightMargin+“”);

          return false;

          }

          @Override

          public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,

          float velocityY) {return false;}

          @Override

          public void onLongPress(MotionEvent e) {}

          @Override

          public void onShowPress(MotionEvent e) {}

          }

          《/span》

        三、智能手機藍牙通信功能:BluetoothChat例程分析

          1. 概述

          Bluetooth 是幾乎現在每部手機標準配備的功能,多用于耳機 mic 等設備與手機的連接,除此之外,還可以多部手機之間建立 bluetooth 通信,本文就通過 SDK 中帶的一個聊天室的例程,來介紹一下 上的 Bluetooth 的

          在 1.x 的時候,相關 API 非常不完善,還不能簡單的使用 Bluetooth ,有一個開源項目可以幫助程序員使用、開發藍牙,支持直接方法 bluetooth 協議棧。在 Android2 以后,框架提供了一些官方 API 來進行藍牙的通信,但目前的程序也比較不完善。本文主要討論 Android2 后的 Bluetooth 通信的 API 使用方法。

          首先看聊天室的效果圖:

          Android上藍牙通信功能開發:BluetoothChat例程分析

          2. Bluetooth 通信 API 介紹

          2.1. Bluetooth 通信過程

        Bluetooth 通信過程  

          2.2. Bluetooth API 的主要方法

          BluetoothAdapter 類

          BluetoothAdapter.getDefaultAdapter() :得到本地默認的 BluetoothAdapter ,若返回為 null 則表示本地不支持藍牙;

          isDiscovering() :返回設備是否正在發現周圍藍牙設備;

          cancelDiscovery() :取消正在發現遠程藍牙設備的過程;

          startDiscovery() :開始發現過程;

          getScanMode() :得到本地藍牙設備的 Scan Mode ;

          getBondedDevices() :得到已配對的設備;

          isEnabled() :藍牙功能是否啟用。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 灌云县| 龙山县| 正阳县| 含山县| 上栗县| 石城县| 丹东市| 禄丰县| 大邑县| 喀什市| 利辛县| 荥经县| 法库县| 五台县| 武川县| 金溪县| 龙门县| 楚雄市| 怀集县| 五华县| 镇原县| 墨江| 贺州市| 湖北省| 垣曲县| 大足县| 阳泉市| 乐山市| 长海县| 叙永县| 长子县| 龙山县| 天峻县| 无为县| 昭平县| 贵定县| 陕西省| 大荔县| 工布江达县| 丽水市| 太康县|