新闻中心

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() :蓝牙功能是否启用。



评论


相关推荐

技术专区

关闭