天天看點

Android滑動标簽和viewPager結合使用

最近做一個需求,類似新聞标簽橫向滑動和内容切換,當内容區左右滑動時标簽需要切換到對應的标題上,設定标題對應樣式變化;當标簽滑動并選中時,内容要相應變化。

大緻思路:橫向滑動使用自定義Horizontalscrollview為了添加滑動監聽事件,滑動時擷取滑動的位置,内容切換使用viewpager。

将标簽TextView添加到自定義Horizontalscrollview中,并将對應的fragment加入viewpager中

//根據标簽的個數設定tab和fragment

for(int i = 0 ; i < postChannelBeens.size(); i++){

String name = postChannelBeens.get(i).getName();//标簽名

TextView tv = new TextView(mActivity);

tv.setId(i);

tv.setText(name);

tv.setTag(name);

tv.setTextColor(getResources().getColor(R.color.tv_color_gray));

tv.setBackgroundResource(R.drawable.shape_gray_12_bg);

tv.setTextSize(14);

tv.setPadding(DensityUtil.dip2px(mActivity, 12),DensityUtil.dip2px(mActivity, 2),DensityUtil.dip2px(mActivity, 12),DensityUtil.dip2px(mActivity, 2));//設定間距預設為px,用工具類将dp轉為px

tv.setSingleLine();

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);

if(i != 0 ){

lp.setMargins(DensityUtil.dip2px(mActivity, 12),0,0,0);//設定TextView之間的距離

}

tv.setLayoutParams(lp);
  final int position = i;
  tv.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {//點選tab時,切換到對應的fragment
          Message msg = new Message();
          msg.what = 1;
          msg.arg1 = position;
          mHandler.sendMessage(msg);
      }
  });
   ll_post_channel.addView(tv);//添加到橫向滑動控件中
   CommunityHotFragment fragment = new CommunityHotFragment();//新添對應的fragment
   fragment.setmParam1(postChannelBeens.get(i).getPost_channel_id());//設定不同的參數
   fragments.add(fragment);//加入清單中
           

}

下面是自定義有監聽事件的橫向滑動

import android.content.Context;

import android.os.Handler;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.widget.HorizontalScrollView;

public class MyHorizontalscrollview extends HorizontalScrollView {

public MyHorizontalscrollview(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public MyHorizontalscrollview(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public MyHorizontalscrollview(Context context) {
    super(context);
}

public interface ScrollViewListener {
    void onScrollChanged(ScrollType scrollType);
}

private Handler mHandler;
private ScrollViewListener scrollViewListener;
/**
 * 滾動狀态   IDLE 滾動停止  TOUCH_SCROLL 手指拖動滾動         FLING滾動
 */
public enum ScrollType{IDLE,TOUCH_SCROLL,FLING};

/**
 * 記錄目前滾動的距離
 */
private int currentX = -9999999;
/**
 * 目前滾動狀态
 */
private ScrollType scrollType = ScrollType.IDLE;
/**
 * 滾動監聽間隔
 */
private int scrollDealy = 50;
/**
 * 滾動監聽runnable
 */
private Runnable scrollRunnable = new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        if(getScrollX()==currentX){
            //滾動停止  取消監聽線程
            scrollType = ScrollType.IDLE;
            if(scrollViewListener!=null){
                scrollViewListener.onScrollChanged(scrollType);
            }
            mHandler.removeCallbacks(this);
            return;
        }else{
            //手指離開螢幕    view還在滾動的時候
            scrollType = ScrollType.FLING;
            if(scrollViewListener!=null){
                scrollViewListener.onScrollChanged(scrollType);
            }
        }
        currentX = getScrollX();
        mHandler.postDelayed(this, scrollDealy);
    }
};


@Override
public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_MOVE:
            this.scrollType = ScrollType.TOUCH_SCROLL;
            scrollViewListener.onScrollChanged(scrollType);
            //手指在上面移動的時候   取消滾動監聽線程
            mHandler.removeCallbacks(scrollRunnable);
            break;
        case MotionEvent.ACTION_UP:
            //手指移動的時候
            mHandler.post(scrollRunnable);
            break;
    }
    return super.onTouchEvent(ev);
}

/**
 * 必須先調用這個方法設定Handler  不然會出錯
 */
public void setHandler(Handler handler){
    this.mHandler = handler;
}
/**
 * 設定滾動監聽
 */
public void setOnScrollStateChangedListener(ScrollViewListener listener){
    this.scrollViewListener = listener;
}
           

}

工具類

public class DensityUtil {

/**
 * 根據手機的分辨率從 dp 的機關 轉成為 px(像素)
 */
public static int dip2px(Context context, float dpValue) {
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (dpValue * scale + 0.5f);
}

/**
 * 根據手機的分辨率從 px(像素) 的機關 轉成為 dp
 */
public static int px2dip(Context context, float pxValue) {
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (pxValue / scale + 0.5f);
}
           

}