首页 > 代码库 > 如果写一个android桌面滑动切换屏幕的控件(三)

如果写一个android桌面滑动切换屏幕的控件(三)

下面我们把这个控件内嵌到Layout中做一些动画和展示,效果图:



这个子控件可以上下移动,可以左右滑动,如果上下滑动距离大于左右滑动距离,则必须上下滑动

这样来写onTouch事件:

	@Override
	public boolean onTouchEvent(MotionEvent ev) {

		if (mVelocityTracker == null) {
			mVelocityTracker = VelocityTracker.obtain();
		}
		mVelocityTracker.addMovement(ev);

		int mScrollX = this.getScrollX();

		final int action = ev.getAction();
		final float x = ev.getX();
		final float y = ev.getY();

		switch (action) {
		case MotionEvent.ACTION_DOWN:
			mFlagLimitMove = false;
			mFlagLimitUp = false;
			/*
			 * If being flinged and user touches, stop the fling. isFinished
			 * will be false if being flinged.
			 */
			if (!mScroller.isFinished()) {
				mScroller.abortAnimation();
			}

			// Remember where the motion event started
			mOriMotionX = x;
			mOriMotionY = y;
			mLastMotionX = x;
			mLastMotionY = y;
			mTimeDown = System.currentTimeMillis();
			mLastDownX = x;
			return true;
		case MotionEvent.ACTION_MOVE:
			//如果是往后滑动,屏幕向前,那么mLastMotionX是比x大的,deltaX是正的
			int deltaX = (int) (mLastMotionX - x);
			int deltaY = (int) (mLastMotionY - y);

			// final int moveX = (int) (mOriMotionX - x);
			final int moveY = (int) (mOriMotionY - y);
			mLastMotionX = x;
			mLastMotionY = y;
			//X方向的移动更多
			if (Math.abs(deltaY) < Math.abs(deltaX)) {
				//虽然X方向移动更多,但由于已经判定为上下滑动,所以只能return true,做这种情况左右不能滑动
				if (mFlagLimitUp) {
					return true;
				}

				final int buffer = getWidth() / 2;
				if (deltaX < 0) {
						if (deltaX < -MOVEY_NUM_X) {
							//mFlagLimitMove代表X方向确认在滑动了
							mFlagLimitMove = true;
						}
						
						if (mCurrentScreen == 0 && !mExecuteWhileSnapOut) {
							System.out.println("=====deltaX="+deltaX);
						    deltaX = getSlowDownDelta(deltaX);
						    System.out.println("=====after deltaX="+deltaX);
						}
						
						System.out.println("====mScrollX="+mScrollX+"buffer="+buffer+"deltaX="+deltaX+"x="+(Math.max(-mScrollX - buffer, deltaX)));
						scrollBy(Math.max(-mScrollX - buffer, deltaX), 0);
//					}
				} else if (deltaX > 0) {
					int availableToScroll = 0;
					
					if (getChildCount() > 0) { //此时Workspace上可能未加任何item,count == 0
					    availableToScroll = getChildAt(
			                            getChildCount() - 1).getRight()
			                            - mScrollX - getWidth();
					}
					
						if (deltaX > MOVEY_NUM_X) {
							mFlagLimitMove = true;
						}
						
						if (mCurrentScreen == getChildCount() - 1 && !mExecuteWhileSnapOut) {
                            deltaX = getSlowDownDelta(deltaX);
                        }
						
						System.out.println("====availableToScroll="+availableToScroll+"deltaX="+deltaX);
						scrollBy(Math.min(availableToScroll + buffer, deltaX), 0);

				}
			} else {
				//如果已经判定为上下滑动或 ,当时X方向也有移动,这种情况也不处理
				if (mFlagLimitMove || mFlagLimitUp) {
					return true;
				}
				//deltaY>0说明为往上滑动
				if (deltaY > 0 && moveY > MOVEY_NUM) {
					if (mHandler != null) {

						mFlagLimitUp = true;
						mHandler.sendMessage(mHandler
								.obtainMessage(DingLayout.MESSAGE_MOVING_UP));
					}
				} else if (deltaY < 0 && moveY < -MOVEY_NUM) {
					if (mHandler != null) {
						mFlagLimitUp = true;
						mHandler.sendMessage(mHandler
								.obtainMessage(DingLayout.MESSAGE_MOVING_DOWN));
					}
				}
			}

			return true;
		case MotionEvent.ACTION_UP:
			final VelocityTracker velocityTracker = mVelocityTracker;
			velocityTracker.computeCurrentVelocity(DEFAULT_VALUE,
					mMaximumVelocity);
			int velocityX = (int) velocityTracker.getXVelocity();
			int velocityY = (int) velocityTracker.getYVelocity();
			System.out.println("====mFlagLimitUp="+mFlagLimitUp+"mFlagLimitMove="+mFlagLimitMove);
			if (!mFlagLimitUp) {
				if (velocityX > SNAP_VELOCITY && mCurrentScreen > 0) {
					// Fling hard enough to move left
					snapToScreen(mCurrentScreen - 1);
				} else if (velocityX < -SNAP_VELOCITY
						&& mCurrentScreen < getChildCount() - 1) {
					// Fling hard enough to move right
					snapToScreen(mCurrentScreen + 1);
				} else {
					snapToDestination(mLastMotionX < mOriMotionX);
				}
			} else {
				snapToDestination(mLastMotionX < mOriMotionX);
			}
			mTimeUp = System.currentTimeMillis();
			//如果x方向移动非常少,并且没有y方向的移动,我们来判断是不是点击事件
			if (!mFlagLimitUp && !mFlagLimitMove) {

				// 如果点击时间比较短,而且手指没有移动很大位置,则认为为点击事件
				if (Math.abs(x - mOriMotionX) < MOVE_LIMIT
						&& Math.abs(y - mOriMotionY) < MOVE_LIMIT
						&& Math.abs(mTimeUp - mTimeDown) < TIME_LIMIT) {
					if (mHandler != null) {
						mHandler.sendMessage(mHandler.obtainMessage(
								DingLayout.MESSAGE_MOVING_CLICK, y));
						return true;
					}
				}

				if (velocityY > Y_RATE_LIMIT
						&& Math.abs(velocityX) < X_RATE_LIMIT) {
					if (mHandler != null) {
						mHandler.sendMessage(mHandler
								.obtainMessage(DingLayout.MESSAGE_MOVING_DOWN));
					}
				} else if (velocityY < -Y_RATE_LIMIT
						&& Math.abs(velocityX) < X_RATE_LIMIT) {
					if (mHandler != null) {
						mHandler.sendMessage(mHandler
								.obtainMessage(DingLayout.MESSAGE_MOVING_UP));
					}
				}
			} // end flag

			if (mVelocityTracker != null) {
				mVelocityTracker.recycle();
				mVelocityTracker = null;
			}

			mFlagLimitMove = false;
			mFlagLimitUp = false;

			mTouchState = TOUCH_STATE_REST;

			if (Math.abs(mLastDownX - x) > TEN) {
				return true;
			}
			return false;
			
		case MotionEvent.ACTION_CANCEL:
			mTouchState = TOUCH_STATE_REST;
			return false;
		default:
			break;
		}

		return true;
	}

activity:

布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/MainRoot"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@id/float_MainRoot" >

        <ImageView
            android:id="@+id/bgView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:scaleType="centerCrop"
            android:src=http://www.mamicode.com/"@drawable/search_bg5" />>
activity:

public class DingLayoutActivity extends Activity implements
		OnViewChangedListener {

	DingLayout mDingLayout;
	Workspace mWorkspace;
	/** 用inflater来载入layout. */
	private LayoutInflater mInflater;
	int mTotalDingnum;
	ImageView mBtnRefresh;
	private int mCurrentDownUrlIndex = 0;

	public Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {

		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.main1);

		mDingLayout = (DingLayout) findViewById(R.id.dinglayout);
		mDingLayout.setHandlerFormActivity(this.mHandler);

		mWorkspace = (Workspace) findViewById(R.id.workspace);
		mWorkspace.setOnViewChangedListener(this);

		initialWorkspace();

	}

	/**
	 * 初始化workspace.
	 */
	private void initialWorkspace() {

		mInflater = LayoutInflater.from(this);
		// 该list为内存中的ding列表,列表中元素存储着ding的A部分数据
		DingManager dingMgr = DingManager.getInstance(this);
		List<DingInfo> list = dingMgr.getDingList();
		mTotalDingnum = list.size();

		// 遍历列表中的各个元素来构造workspace中的view
		for (int i = 0; i < mTotalDingnum; i++) {
			View view = mInflater.inflate(R.layout.ding_item, null);

			DingInfo info = list.get(i);
			view.setTag(info.getDingId());

			String oldContent = info.getContent();

			mWorkspace.addView(view);

			mBtnRefresh = (ImageView) view.findViewById(R.id.btn_refresh);
			setViewData(info, view, true);

			info.setContent(oldContent);
			// end modify
		}

		mDingLayout.updateDots(mTotalDingnum, mCurrentDownUrlIndex);
	}

	private void setViewData(DingInfo netdingdata, View view, boolean useTitle) {
		if (view == null) {
			return;
		}

		TextView title = (TextView) view.findViewById(R.id.title);
		TextView content = (TextView) view.findViewById(R.id.main_content);
		TextView description = (TextView) view.findViewById(R.id.description);
		TextView time = (TextView) view.findViewById(R.id.time);
		title.setText(netdingdata.getTitle());
		// 默认值如果为空,不更新
		String updateContent = netdingdata.getContent();
		if (!TextUtils.isEmpty(updateContent)) {
			// modify by qiaopu 用title的view
			if (useTitle) {
				title.setText(netdingdata.getContent());
				content.setText("");
			} else {
				content.setText(netdingdata.getContent());
			}
			// end modify
		}

		description.setText(netdingdata.getDescription());
		time.setText(netdingdata.getTime());

	}

	@Override
	public void onViewChanged(int viewIndex) {
		if (viewIndex < 0 || viewIndex >= mTotalDingnum) {
			// Log.d(TAG, "invalid mCurrentDownUrlIndex");
			return;
		}

		if (mCurrentDownUrlIndex != viewIndex) {
			View view = mWorkspace.getChildAt(mCurrentDownUrlIndex);
			if (view != null) {
			}

			mCurrentDownUrlIndex = viewIndex;
			mDingLayout.updateDots(mTotalDingnum, mCurrentDownUrlIndex);

		}

	}

}

DingLayout:

public class DingLayout extends RelativeLayout {
//	/** Context */
//	private Context mContext;

	/** MESSAGE_MOVING_UP表示手势的动作为向上滑. */
	public static final int MESSAGE_MOVING_UP = 0;

	/** MESSAGE_MOVING_UP表示手势的动作为向下滑. */
	public static final int MESSAGE_MOVING_DOWN = 1;

	/** MESSAGE_MOVING_UP表示手势的动作为点击. */
	public static final int MESSAGE_MOVING_CLICK = 2;

	/** isUp为判断workspace是否在上方. */
	private boolean mIsUp = false;

	/** isUp为判断滑动的动画是否在进行中. */
	private boolean mIsMove = false;

	/** 可上下滑动的Layout,包括Workspace和点点提示。 */
	private ViewGroup mUpDownLayout;
	/** Workspace. */
	private Workspace mSpace;
	/** 点点提示Workspace当前页的Layout。 */
	private LinearLayout mDotsLayout;
    /** 点点的Y坐标偏移。由于点点需要显示在DING图标下面,而DING图标只有在Workspace的screen中才有,所以用此全局来计算并记住。 */
	private int mDotsOffsetY;
	/** 当前索引。 */
	private int mCurrent = -1;
    
	/** log tag. */
	private static final String TAG = "DingLayout";


	/** 动画运行时间. */
	private static final int ANIMATIONTIME = 650;

	/** mHandlerFromMainActivity从main activity传进来. */
	private Handler mHandlerFromMainActivity;

	/** 是否是动画进行中.*/
	private boolean isRunning = false;
	
	/** Context*/
	private Context mContext = null;
	
	/**
	 * view的构造函数.
	 * 
	 * @param context
	 *            context
	 * @param attrs
	 *            attrs
	 * 
	 */
	public DingLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
		mIsUp = false;
		isRunning = false;
		mContext = context;
	}

	/**
	 * @return 为ding在上还是在底下的标识
	 */
	public boolean isUp() {
		return mIsUp;
	}

	/**
	 * 把mainActivity的hander传入这个view.
	 * @param handlerFromMainActivity HandlerFromMainActivity           
	 */
	public void setHandlerFormActivity(Handler handlerFromMainActivity) {
		this.mHandlerFromMainActivity = handlerFromMainActivity;
	}

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        //如果在动画进行中,不进行event的分发
        if (isRunning) {
            return true;
        }
        return super.dispatchTouchEvent(ev);
    }

	
    @Override
    protected void onLayout(boolean changed, int left, int top, int right,
            int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        //下面两句保证初始化时workspace的位置在上面或是在下面
        if (mIsUp) {
            layoutUp();
        } else {
            layoutDown();
        }
        
        if (mDotsOffsetY == 0) {
            View dingView = findViewById(R.id.ding_view);
            if (dingView != null) {
                mDotsOffsetY = dingView.getBottom();
                System.out.println("=====mDotsOffsetY="+mDotsOffsetY);
            }
        }
        
        if (mDotsOffsetY > 0) {
            //需要修改LayoutParams,否则在parent调用Layout的时候,坐标又会被改变。
            LayoutParams params = (LayoutParams) mDotsLayout.getLayoutParams();
            params.topMargin += mDotsOffsetY;
            mDotsLayout.layout(mDotsLayout.getLeft(), 
                    mDotsLayout.getTop() + mDotsOffsetY, 
                    mDotsLayout.getRight(), 
                    mDotsLayout.getBottom() + mDotsOffsetY);
            
            //只需执行一次。
            mDotsOffsetY = -1;
        }
    }

	@Override
	protected void onFinishInflate() {
		super.onFinishInflate();
		
		mUpDownLayout = (ViewGroup) findViewById(R.id.ding_updown_layout);
		
		mSpace = (Workspace) findViewById(R.id.workspace);
		mSpace.setHandler(mHandler);
		//<add by qumiao 2012.3.16 BEGIN
		//fix bug: SEARHBOX-219 【二期】多个Ding的时候,左右滑动Ding的时候,显示ding位置的点点不应该随ding移动
		mSpace.setSnapListener(new WorkspaceSnapListener() {
            
            @Override
            public void onSnapToScreen(Workspace workspace, int whichScreen) {
                updateDots(getDingCount(), whichScreen);
            }
        });
		//add by qumiao 2012.3.16 END>
		
		mDotsLayout = (LinearLayout) findViewById(R.id.dots_layout);
	}
	
	/**
	 * 更新点点的状态,包括总数和当前位置。
	 * @param total 总数。
	 * @param current 当前位置。
	 */
	public void updateDots(int total, int current) {
	    Workspace.updateDots(mDotsLayout, total, current, null);
	}

	/**
     * setCurrentScreen.
     * @param index Index.
     */
    public void setCurrentScreen(int index) {
        mSpace.setCurrentScreen(index);
        updateDots(getDingCount(), index);
    }
      
	/**
	 * set IsUp的值.
	 * @param isUp  set mIsUp值          
	 */
	public void setIsUp(boolean isUp) {
		this.mIsUp = isUp;
	}
	
	/**
	 * 获取Ding的数量。
	 * @return 数量。
	 */
	private int getDingCount() {
	    List<DingInfo> list = DingManager.getInstance(getContext())
                .getDingList();
        return list.size();
	}

	/**
	 * 向上移的动画.
	 */
	private void moveUp() {
        logCat("moveUp mToppanel.getWidth()=" + mUpDownLayout.getWidth()
                    + "mToppanel.getHeight()=" + mUpDownLayout.getHeight());
        layoutUp();
        
        Animation upAnimation = new TranslateAnimation(0, 0,
                getWorkSpaceDownPosition(), 0);
        upAnimation.setDuration(ANIMATIONTIME);
        upAnimation.setAnimationListener(new AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {
                mIsMove = true;
                isRunning = true;
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                mIsMove = false;
                isRunning = false;
                if (mHandlerFromMainActivity != null) {
                    Message msg = mHandlerFromMainActivity.obtainMessage();
                    msg.what = SearchListener.MSG_ANIMATION_DONE;
                    mHandlerFromMainActivity.handleMessage(msg);
                    mHandlerFromMainActivity
                            .sendEmptyMessage(SearchListener.MSG_DING_UP_FINISHED);
                    mHandlerFromMainActivity
                            .sendEmptyMessage(SearchListener.MSG_DING_MOVE_UP);
                }
            }
        });
        
        if (mHandlerFromMainActivity != null) {
            Message msg = mHandlerFromMainActivity.obtainMessage();
            msg.what = SearchListener.MSG_ANIMATION_PREPARE;
            mHandlerFromMainActivity.handleMessage(msg);
        }
        mUpDownLayout.startAnimation(upAnimation);
	}

    /**
     * 向下移的动画.
     */
    private void moveDown() {
        if (mHandlerFromMainActivity != null) {
            //<modified by qumiao 2012.2.15 BEGIN
            //异步改成同步,以免影响动画效果。
//            mHandlerFromMainActivity
//                    .sendEmptyMessage(SearchListener.MSG_DING_MOVE_DOWN);
            Message msg = mHandlerFromMainActivity.obtainMessage();
            msg.what = SearchListener.MSG_DING_MOVE_DOWN;
            mHandlerFromMainActivity.handleMessage(msg);
            //modified by qumiao END>
        }
        
        logCat("mToppanel.getWidth()=" + mUpDownLayout.getWidth()
                + "mToppanel.getHeight()=" + mUpDownLayout.getHeight());
        layoutDown();

        Animation downAnimation = new TranslateAnimation(0, 0,
                -getWorkSpaceDownPosition(), 0);
        downAnimation.setDuration(ANIMATIONTIME);
        downAnimation.setAnimationListener(new AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {
                mIsMove = true;
                isRunning = true;
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                mIsMove = false;
                isRunning = false;
                if (mHandlerFromMainActivity != null) {
                    Message msg = mHandlerFromMainActivity.obtainMessage();
                    msg.what = SearchListener.MSG_ANIMATION_DONE;
                    mHandlerFromMainActivity.handleMessage(msg);
                }
            }
        });

        
        if (mHandlerFromMainActivity != null) {
            Message msg = mHandlerFromMainActivity.obtainMessage();
            msg.what = SearchListener.MSG_ANIMATION_PREPARE;
            mHandlerFromMainActivity.handleMessage(msg);
        }
        mUpDownLayout.startAnimation(downAnimation);
    }
    
    /**
     * 上移。
     */
    private void layoutUp() {
        mUpDownLayout.layout(mUpDownLayout.getLeft(), 0, mUpDownLayout.getRight(),
                mUpDownLayout.getHeight());
        mUpDownLayout.setDrawingCacheEnabled(true);
        mUpDownLayout.buildDrawingCache();
    }

    /**
     * 下移。
     */
    private void layoutDown() {
    	
        int workSpacePosition = getWorkSpaceDownPosition();
        mUpDownLayout.layout(mUpDownLayout.getLeft(), workSpacePosition, 
                mUpDownLayout.getRight(), workSpacePosition + mUpDownLayout.getHeight());
        mUpDownLayout.setDrawingCacheEnabled(false);
    }

	/**
	 * 获取workspace下移后的(top)position。
	 * @return position.
	 */
	private int getWorkSpaceDownPosition() {
		//A部分的高度
	    int heightPartA = getResources().getDimensionPixelSize(R.dimen.browseraddview_height);
        return getHeight() - heightPartA;
	}

    /**
     * 打log用.
     * @param log log           
     */
    private void logCat(String log) {
    }

	/**
	 * 处理动画的Handler.
	 */
	private Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			if (mIsMove) {
				return;
			}
			switch (msg.what) {
			case MESSAGE_MOVING_UP:
				// top.setVisibility(View.GONE);

				if (!mIsUp) {
					mIsUp = true;
					moveUp();
				}
				break;
			case MESSAGE_MOVING_DOWN:
				if (mIsUp) {
					mIsUp = false;
					// if(mHandler_fromActivity != null){
					// mHandler_fromActivity.sendEmptyMessage(SearchListener.MSG_DING_MOVE_DOWN);
					// }
					moveDown();
				}
				break;
			case MESSAGE_MOVING_CLICK:
				Object obj = msg.obj;
				Float t = (Float) obj;

				int dingLayoutHeight = getResources().getDimensionPixelSize(R.dimen.browseraddview_height);
				// t<ding_layout_height在ding_layout中点击才是有效的,在webview中点击是无效的
				if (mIsUp && t < dingLayoutHeight) {
					moveDown();
					mIsUp = false;
				} else if (t < dingLayoutHeight) {
					moveUp();
					mIsUp = true;
				}
				break;
				
			default:
			    if (mHandlerFromMainActivity != null) {
                    mHandlerFromMainActivity.handleMessage(msg);
                }
				break;
			}

		}
	};

}

item的布局:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" tools:ignore="PxUsage"
	android:layout_width="fill_parent" 
	android:layout_height="fill_parent">

	<ImageView 
	    android:id="@+id/ding_part_a_background"
	    android:layout_width="fill_parent"
	    android:layout_height="@dimen/browseraddview_height"
	    android:background="@drawable/ding_rectangle"
    />

    <View 
        android:id="@+id/ding_topline1"
        android:layout_width="fill_parent"
        android:layout_height="1px" 
        android:layout_alignParentTop="true"
        android:background="#E5000000" 
    />
    <View 
        android:id="@+id/ding_topline2"
        android:layout_width="fill_parent"
        android:layout_height="1px" 
        android:layout_below="@+id/ding_topline1"
        android:background="#19ffffff" 
    />

    <!-- 阿拉丁A部分显示4行文字 -->
    <TextView 
        android:id="@+id/title"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_below="@+id/ding_topline2"
        android:layout_marginRight="50dip"
        android:layout_marginLeft="10dip"
        android:layout_marginTop="8dip" 
        style="@style/DingTypeFaceStyle"
        android:textSize="18.6dip" 
        android:textColor="#ffffff" 
        android:text="" 
    />
    <TextView 
        android:id="@+id/main_content" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:layout_below="@+id/title"
        android:layout_marginLeft="10dip"
        android:layout_marginTop="0dip" 
        style="@style/DingTypeFaceStyle"
        android:textSize="32dip" 
        android:textColor="#ffffff"
        android:text="数据加载中..." 
    />
    <TextView 
        android:id="@+id/description" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:layout_below="@+id/main_content"
        android:layout_marginLeft="10dip"
        android:layout_marginTop="0dip" 
        style="@style/DingTypeFaceStyle"
        android:textSize="13.3dip" 
        android:textColor="#ffffff"
        android:text="" 
    />
    <TextView 
        android:id="@+id/time" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:layout_below="@+id/description"
        android:layout_marginLeft="10dip"
        android:layout_marginTop="2dip" 
        style="@style/DingTypeFaceStyle"
        android:textSize="10.6dip" 
        android:textColor="#ffffff"
        android:text="" 
    />

    <!-- 阿拉丁A部分右侧的刷新按钮布局 -->
    <ImageView 
        android:id="@+id/btn_refresh" 
        android:src=http://www.mamicode.com/"@drawable/trans_ding_refresh">