亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

一個簡單的界面拖動切換效果類ScrollViewGroup

系統 1585 0
網上找的一個簡單的界面平滑切換類,我只改動了一點點代碼。
該類不能循環切換!
一個簡單的界面拖動切換效果類ScrollViewGroup
    
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.Scroller;

public class ScrollViewGroup extends ViewGroup {

	private static final String TAG = "scroller";

	private Scroller scroller;

	private int currentScreenIndex;

	public int getCurrentScreenIndex() {
		return currentScreenIndex;
	}

	public void setCurrentScreenIndex(int currentScreenIndex) {
		this.currentScreenIndex = currentScreenIndex;
	}

	private GestureDetector gestureDetector;

	// 設置一個標志位,防止底層的onTouch事件重復處理UP事件
	private boolean fling;

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

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

	public ScrollViewGroup(Context context) {
		super(context);
		initView(context);
	}

	private void initView(final Context context) {
		this.scroller = new Scroller(context);

		this.gestureDetector = new GestureDetector(new OnGestureListener() {

			@Override
			public boolean onSingleTapUp(MotionEvent e) {
				return false;
			}

			@Override
			public void onShowPress(MotionEvent e) {
			}

			@Override
			public boolean onScroll(MotionEvent e1, MotionEvent e2,
					float distanceX, float distanceY) {
				if ((distanceX > 0 && currentScreenIndex < getChildCount() - 1)// 防止移動過最后一頁
						|| (distanceX < 0 && getScrollX() > 0)) {// 防止向第一頁之前移動
					scrollBy((int) distanceX, 0);
				}
				return true;
			}

			@Override
			public void onLongPress(MotionEvent e) {
			}

			@Override
			public boolean onFling(MotionEvent e1, MotionEvent e2,
					float velocityX, float velocityY) {
				Log.d(TAG, "min velocity >>>"
						+ ViewConfiguration.get(context).getScaledMinimumFlingVelocity()
						+ " current velocity>>" + velocityX);
				// 判斷是否達到最小輕松速度,取絕對值的
				if (Math.abs(velocityX) > ViewConfiguration.get(context).getScaledMinimumFlingVelocity()) {
						if (velocityX > 0 && currentScreenIndex > 0) {//手指從左往右劃
							Log.d(TAG, ">>>>fling to left");
							fling = true;
							scrollToScreen(currentScreenIndex - 1);
						} else if (velocityX < 0 && currentScreenIndex < getChildCount() - 1) {
							Log.d(TAG, ">>>>fling to right");
							fling = true;
							scrollToScreen(currentScreenIndex + 1);
						}
				}

				return true;
			}

			@Override
			public boolean onDown(MotionEvent e) {
				return false;
			}
		});
		
	}

	@Override
	protected void onLayout(boolean changed, int left, int top, int right,int bottom) {
		Log.d(TAG, ">>left: " + left + " top: " + top + " right: " + right
				+ " bottom:" + bottom);

		/**
		 * 設置布局,將子視圖順序橫屏排列
		 */
		for (int i = 0; i < getChildCount(); i++) {
			View child = getChildAt(i);
			child.setVisibility(View.VISIBLE);
			child.measure(right - left, bottom - top);
			child.layout(0 + i * getWidth(), 0, getWidth() + i * getWidth(),
					getHeight());
		}
		
		//初始化顯示第幾個界面
		int delta = currentScreenIndex * getWidth() - getScrollX();
		scroller.startScroll(getScrollX(), 0, delta, 0, 0);
		invalidate();
	}

	@Override
	public void computeScroll() {
		if (scroller.computeScrollOffset()) {
			scrollTo(scroller.getCurrX(), 0);
			postInvalidate();
		}
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		gestureDetector.onTouchEvent(event);

		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			break;
		case MotionEvent.ACTION_MOVE:
			break;
		case MotionEvent.ACTION_UP:
			if (!fling) {
				snapToDestination();
			}
			fling = false;
			break;
		default:
			break;
		}
		return true;
	}

	/**
	 * 切換到指定屏
	 * 
	 * @param whichScreen
	 */
	private void scrollToScreen(int whichScreen) {
		if (getFocusedChild() != null && whichScreen != currentScreenIndex
				&& getFocusedChild() == getChildAt(currentScreenIndex)) {
			getFocusedChild().clearFocus();
		}

		final int delta = whichScreen * getWidth() - getScrollX();
		scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2);
		invalidate();

		currentScreenIndex = whichScreen;
		if (onScreenChangeListener != null) {
			onScreenChangeListener.onScreenChange(currentScreenIndex);
		}
	}

	/**
	 * 根據當前x坐標位置確定切換到第幾屏
	 */
	private void snapToDestination() {
		scrollToScreen((getScrollX() + (getWidth() / 2)) / getWidth());
	}

	public interface OnScreenChangeListener {
		void onScreenChange(int currentIndex);
	}
	private OnScreenChangeListener onScreenChangeListener;

	public void setOnScreenChangeListener(OnScreenChangeListener onScreenChangeListener) {
		this.onScreenChangeListener = onScreenChangeListener;
	}
}

  


三個切換小點:
    
import com.easymorse.scroll.ScrollViewGroup.OnScreenChangeListener;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class PageControlView extends LinearLayout {
	private Context context;

	private int count;

	public void bindScrollViewGroup(ScrollViewGroup scrollViewGroup) {
		this.count=scrollViewGroup.getChildCount();
		generatePageControl(scrollViewGroup.getCurrentScreenIndex());
		
		scrollViewGroup.setOnScreenChangeListener(new OnScreenChangeListener() {
			
			@Override
			public void onScreenChange(int currentIndex) {
				// TODO Auto-generated method stub
				generatePageControl(currentIndex);
			}
		});
	}

	public PageControlView(Context context) {
		super(context);
		this.init(context);
	}
	public PageControlView(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.init(context);
	}

	private void init(Context context) {
		this.context=context;
	}

	private void generatePageControl(int currentIndex) {
		this.removeAllViews();

		for (int i = 0; i < this.count; i++) {
			ImageView imageView = new ImageView(context);
			if (currentIndex == i) {
				imageView.setImageResource(R.drawable.page_indicator_focused);
			} else {
				imageView.setImageResource(R.drawable.page_indicator);
			}
			this.addView(imageView);
		}
	}
}

  


用法:
    
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;

public class ScrollDemosActivity extends Activity {

	@SuppressWarnings("unused")
	private static final String TAG = "scroller";

	private ScrollViewGroup viewGroup;

	private PageControlView pageControl;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.main);
		viewGroup = (ScrollViewGroup) findViewById(R.id.scrollViewGroup);

		ImageView imageView = new ImageView(this);
		imageView.setImageDrawable(getResources().getDrawable(R.drawable.a1));
		viewGroup.addView(imageView);

		viewGroup.addView(View.inflate(this, R.layout.layout_0, null));

		imageView = new ImageView(this);
		imageView.setImageDrawable(getResources().getDrawable(R.drawable.a2));
		viewGroup.addView(imageView);

		viewGroup.setCurrentScreenIndex(2);
		
		pageControl=(PageControlView) findViewById(R.id.pageControl);
		pageControl.bindScrollViewGroup(viewGroup);
		
	}
	
}

  


布局:
    
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" 
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	>
	<EditText android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		/>
	<LinearLayout
		android:orientation="horizontal" 
		android:layout_width="fill_parent"
		android:layout_height="fill_parent"
		android:layout_weight="1"
		>
		<EditText 
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:layout_weight="2"
		/>
		<RelativeLayout
			android:id="@+id/myView"
			android:layout_width="fill_parent"
			android:layout_height="fill_parent" 
			android:layout_weight="1"
			>
			<com.easymorse.scroll.ScrollViewGroup
				android:id="@+id/scrollViewGroup" 
				android:layout_width="fill_parent"
				android:layout_height="fill_parent" 
				/>
			<com.easymorse.scroll.PageControlView 
				android:id="@+id/pageControl"
				android:layout_width="fill_parent" 
				android:layout_height="40px"
				android:background="#8f00000f" 
				android:layout_alignParentBottom="true"
				android:gravity="center" 
				/>
		</RelativeLayout>
	</LinearLayout>
	<EditText android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		/>
</LinearLayout>

  

一個簡單的界面拖動切換效果類ScrollViewGroup


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产伦久视频免费观看视频 | 国内精品手机在线观看视频 | 中文字字幕乱码视频 | 国产一区中文字幕在线观看 | 曹逼视频| 久久伊人中文字幕 | 天天操狠狠操 | 九一精品| 手机看片久久 | 国产日韩欧美综合一区 | 午夜色综合| 成人性色生活片免费看爆迷你毛片 | 麻豆精品在线 | 天天做天天爱天天爽 | 青青青在线视频播放免费 | 久热精品免费视频 | 日韩国产欧美 | 美女久久久| 亚州色吧 | 精品国产一区二区三区不卡 | 日日干天天射 | 久久国产精品久久国产精品 | www.97影院| 久久精品国产一区二区三区肥胖 | 亚洲欧美第一页 | 4虎影院午夜在线观看 | 国产成人在线播放视频 | 国产美女色视频 | 亚洲综合视频一区 | 99热在这里只有免费精品 | 国产成人精品免费视 | 国内视频自拍 | 国产精品亚洲午夜不卡 | 91视频青青草 | 爱爱小视频免费体验区在线观看 | 精品久久久久久国产免费了 | 国产成人综合网亚洲欧美在线 | 欧美激情一区 | 欧美精品亚洲网站 | 99久久综合精品国产 | 99成人在线视频 |