类似 qq 切换效果

   如果用 android 等智能手机一定 会用qq吧,那么你肯定见过下面这样:

上面的布局 分为 三块  ,历史,好友,和群组

当分别在这三个上面点击的时候 圆角背景会 移动到新的点击处,同时 下方区域 也会 切换到 相应的 历史或者 其他界面

同时,在下面的区域 用手指滑动 上面的标题栏 也会 移动。

 

   1  实现 下方区域 手指滑动 ,用viewflipper

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

    <include layout="@layout/title" 
        android:layout_height="fill_parent"
        android:layout_weight="1"
        />
    <ViewFlipper
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/viewflipper"
        android:layout_weight="1"
        >
        		<!-- 第一个页面 -->
		<include  layout="@layout/first_linearlayout"/>
		<!-- 第二个页面 -->
		<include  layout="@layout/second_linearlayout"/>
		<!-- 第三个页面 -->
		<include  layout="@layout/third_linearlayout"/>
    </ViewFlipper>
    
</LinearLayout>

       first_linearlayout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
	android:layout_height="fill_parent" 
	android:gravity="center"
    android:orientation="vertical" >
			<ImageView 
			    android:layout_width="wrap_content"
				android:layout_height="wrap_content" 
				android:src="@drawable/a" 
				/>
</LinearLayout>

 实现 接口如下:

public class ViewflipperTestActivity extends Activity implements OnTouchListener,OnGestureListener,OnClickListener{

 

	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {

	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE&& Math.abs(velocityX) > FLING_MIN_VELOCITY) {              
			  // 当像左侧滑动的时候             
			  //设置View进入屏幕时候使用的动画    
			//或者直接:mFlipper.setInAnimation(getApplicationContext(), R.anim.in_left); add by 午夜凶林
			  next();
		     } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) {       
			  // 当像右侧滑动的时候              
			  previous();
		  }          
		  return false;
	}
 
 private void next(){
  mFlipper.setInAnimation(AnimationUtil.inFromRightAnimation(getApplicationContext()));              
    //设置View退出屏幕时候使用的动画              
    mFlipper.setOutAnimation(AnimationUtil.outToLeftAnimation(getApplicationContext()));    
    mFlipper.showNext();          
 }
 private void previous(){
   mFlipper.setInAnimation(AnimationUtil.inFromLeftAnimation(getApplicationContext()));              
    mFlipper.setOutAnimation(AnimationUtil.outToRightAnimation(getApplicationContext()));              
    mFlipper.showPrevious();         
 }

这样就可以实现 下方区域 跟随手指滑动而移动,这个难度不大 ,要实现 上方的标题栏 圆角背景 移动 ,我们 采用动画来做。

在 点击 事件 里

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.textView_1:
			move(textView_1);
			mFlipper.setDisplayedChild(0);
			break;
		case R.id.textView_2:
			move(textView_2);
			mFlipper.setDisplayedChild(1);
			break;
		case R.id.textView_3:
			move(textView_3);
			mFlipper.setDisplayedChild(2);
			break;

		default:
			break;
		} 
		
	}

mFlipper.setDisplayedChild(0); 是控制 下方区域 移动 ,move  是控制圆角背景移动

	private void move(TextView tv){
		if(tv != curr_view){
			if(isFirst){
				from_left = getLeft(textView_1);
				isFirst = false;
				changeParent();
				move(tv);
			}else{
				to_left = getLeft(tv);
				//iv_bg.startAnimation(AnimationUtil.startTransform(getApplicationContext(), from_left, to_left));
				TranslateAnimation animation = new TranslateAnimation(from_left, to_left, 0, 0);
				animation.setDuration(400);
				animation.setFillAfter(true);
				iv_bg.bringToFront();
				iv_bg.startAnimation(animation);
				
				//fly
				mFlipper.setNextFocusDownId(R.id.relativeLayout_3);
				mFlipper.setNextFocusRightId(R.id.relativeLayout_3);
				curr_view = tv;
				from_left = to_left;
			}
		}
	}

ok ,可以了,将move(。。。) 方法 加在 onFling  (。。。) 里就可以实现我们所需要的全部效果了。

 

下面是我的效果图:








 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值