天天看點

自定義HorizontalScrollView模仿RadioGroup+Fragment+Viewpager的翻頁與點選效果,效果完全一樣

自定義HorizontalScrollView模仿RadioGroup+Fragment+Viewpager的翻頁與點選效果,效果完全一樣
自定義HorizontalScrollView模仿RadioGroup+Fragment+Viewpager的翻頁與點選效果,效果完全一樣
自定義HorizontalScrollView模仿RadioGroup+Fragment+Viewpager的翻頁與點選效果,效果完全一樣

界面如圖.有點粗陋,不要在意,隻是充個數.

監聽螢幕滑動,結合距離和滑動速度來判斷翻頁.

保證跟效果跟使用RadioGroup+ViewPager+Fragment+FragmentManagement的效果一樣!

注意,可以跟上面的頂部分欄關聯的喔,個人覺得很有用,特拿出來分享.~

首先,貼上自定義的HorizontalScrollview

/**
 * 翻頁效果的水準滑動視圖
 * @author  心動,即是不理性℃
 *
 */
public class PageScrollView extends HorizontalScrollView{
	private int childCount = 0;
	private ViewGroup ll_container = null;
	private int currentPage = 0;
	private ArrayList<Integer> pointList = new ArrayList<Integer>();

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

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

	public PageScrollView(Context context) {
		super(context);
		init();
	}

	private void init() {
		setHorizontalScrollBarEnabled(false);
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		retrieveChildInfo();
	}

	public void retrieveChildInfo() {
		ll_container = (ViewGroup) getChildAt(0);
		if (ll_container != null) {
			childCount = ll_container.getChildCount();
			for (int i = 0; i < childCount; i++) {
				if ((ll_container.getChildAt(i)).getWidth() > 0) {
					pointList.add((ll_container.getChildAt(i)).getLeft());
				}
			}
		}

	}

	private float downX=-1,downY=-1;
	private long downTime=0;
	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		switch (ev.getAction()) {
		case MotionEvent.ACTION_DOWN:
			downX=ev.getRawX();
			downY=ev.getRawY();
			break;
		case MotionEvent.ACTION_MOVE:
			if(downX==-1||downY==-1||downTime==0){
				downX=ev.getRawX();
				downY=ev.getRawY();
				downTime=System.currentTimeMillis();
			}
			break;
		case MotionEvent.ACTION_UP:
		case MotionEvent.ACTION_CANCEL: 
			slidePage(judgeSlide(downX, downY,ev.getRawX(),ev.getRawY(),System.currentTimeMillis()-downTime,this.getContext()));
			downTime=0;
			return true;
		
		}
		return super.onTouchEvent(ev);
	}
	
	/**
	 * 關于翻頁的判斷.
	 * Last Modifi.. 161123
	 * @param x1
	 * @param y1
	 * @param x2
	 * @param y2
	 * @return -1←左,1→右,0-如如不動.
	 * 
	 */
	private int judgeSlide(float x1,float y1,float x2,float y2,long time,Context context){
		int ori=0;
//		if(Math.abs(y2-y1)<genkai){//對Y方向還是不做限制好了,161123.
			int genkai=time>timeGenkai?genkaiNormal:genkaiFast;
			if(x2-x1>genkai){
				ori= -1;
			}else if(x2-x1<-genkai){
				ori= 1;
			}
			android.util.Log.e("", "kyori:"+(x2-x1)+";time:"+time);
//		}
		return ori;
	}
	private final int genkaiNormal=Util.getScreenWidth(getContext())/4;
	private final long timeGenkai=60;
	private final int genkaiFast=16;

	/**
	 * 翻頁
	 * @param ori 方向
	 */
	private void slidePage(int ori) {
		if(ori==0)
			smoothScrollTo(pointList.get(currentPage), 0);
		else if(ori==1){
			if (currentPage < childCount - 1) {
				currentPage++;
				smoothScrollTo(pointList.get(currentPage), 0);
			}
		}else if(ori==-1){
			if (currentPage > 0) {
				currentPage--;
				smoothScrollTo(pointList.get(currentPage), 0);
			}
		}

		if(scrollListener!=null)
			scrollListener.onPageScrolled(currentPage);
		
	}

	/**
	 * 跳轉到指定的頁面
	 * 
	 * @param page
	 * @return
	 */
	public boolean gotoPage(int page) {
		if (page > -1 && page < childCount) {
			smoothScrollTo(pointList.get(page), 0);
			currentPage = page;
			return true;
		}
		return false;
	}
	
	private OnPageScrolledListener scrollListener;
	public interface OnPageScrolledListener{
		void onPageScrolled(int currentPage);
	}
	public void setOnPageScrolledListener(OnPageScrolledListener scrollListener){
		this.scrollListener=scrollListener;
	}

	public void onPageScrolled() {
		scrollListener.onPageScrolled(currentPage);
	}
}
           

接着,看布局檔案↓

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

    <RadioGroup
        android:id="@+id/rg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:background="@android:color/white"
        android:gravity="center"
        android:orientation="horizontal" >

        <RadioButton
            android:id="@+id/rb1"
            style="@style/top_select_tab"
            android:checked="true"
            android:drawableBottom="@drawable/tab_line_selector"
            android:text="資料" />

        <RadioButton
            android:id="@+id/rb2"
            style="@style/top_select_tab"
            android:drawableBottom="@drawable/tab_line_selector"
            android:text="清單" />
    </RadioGroup>

    <View style="@style/top_tab_divider_gray" />

    <widget.PageScrollView
        android:id="@+id/psv"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1" >

        <LinearLayout
            android:id="@+id/page_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal" >

			<TextView 
			    android:id="@+id/tv"
	            android:layout_width="match_parent"
	            android:layout_height="match_parent"
	            android:gravity="center"
	            android:text="界面一"/>
			
			<ListView 
			    android:id="@+id/lv"
	            android:layout_width="match_parent"
	            android:layout_height="wrap_content"/>
        </LinearLayout>
    </widget.PageScrollView>

</LinearLayout>
           

現在,路已鋪好,看怎麼跑路的了

public class MainActivity extends Activity {
	private RadioButton rb1,rb2;
	private PageScrollView pageSv;
	private ArrayList<String> list=new ArrayList<String>();
	private BaseAdapter adapter;
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.main);
		rb1=(RadioButton) findViewById(R.id.rb1);
		rb2=(RadioButton) findViewById(R.id.rb2);
		rb1.setOnClickListener(mClicker);
		rb2.setOnClickListener(mClicker);
		
		TextView tv=(TextView) findViewById(R.id.tv);
		ListView lv=(ListView) findViewById(R.id.lv);
		int screenWidth=Util.getScreenWidth(this);
		tv.getLayoutParams().width=screenWidth;
		tv.setLayoutParams(tv.getLayoutParams());
		lv.getLayoutParams().width=screenWidth;
		lv.setLayoutParams(lv.getLayoutParams());
		adapter=new BaseAdapter() {
			
			@Override
			public View getView(int position, View convertView, ViewGroup parent) {
				String text=list.get(position);
				TextView tv=new TextView(MainActivity.this);
				tv.setText(text);
				return tv;
			}
			
			@Override
			public long getItemId(int position) {
				return position;
			}
			
			@Override
			public Object getItem(int position) {
				return list.get(position);
			}
			
			@Override
			public int getCount() {
				return list.size();
			}
		};
		lv.setAdapter(adapter);
		
		pageSv=(PageScrollView) findViewById(R.id.psv);
		pageSv.setOnPageScrolledListener(new PageScrollView.OnPageScrolledListener() {
			
			@Override
			public void onPageScrolled(int currentPage) {
				switch (currentPage) {
				case 0:
					rb1.setChecked(true);
					break;
				case 1:
					rb2.setChecked(true);
					break;

				default:
					break;
				}
			}
		});
           
initData();
	}


	
	private void initData() {
		for(int i=0;i<90;i++){
			String text="TextView_"+(i+1);
			list.add(text);
		}
//  		adapter.notifyDataSetChanged();//登出,否則一開始看到的是第二頁.
	}



	private View.OnClickListener mClicker=new View.OnClickListener() {
		
		public void onClick(View v) {
			// TODO Auto-generated method stub
			switch (v.getId()) {
			case R.id.rb1:
				pageSv.gotoPage(0);
				break;
			case R.id.rb2:
				pageSv.gotoPage(1);
				break;

			default:
				break;
			}
		}
	};
}
           

最後,好人做到底,貼上項目源碼下載下傳連結.

http://download.csdn.net/detail/keanta/9691844

不好意思,要了2分,因為,我需要點分...~~~^_^~~~



繼續閱讀