MainActivity
Java代碼 收藏代碼
package org.wp.activity;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageScrollView imageScrollView = null;
private PageControlView pageControlView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageScrollView = (ImageScrollView) this.findViewById(R.id.myImageScrollView);
ImageView imageView = new ImageView(this);
imageView.setImageResource(R.drawable.a1);
imageScrollView.addView(imageView);
imageView = new ImageView(this);
imageView.setImageResource(R.drawable.a2);
imageScrollView.addView(imageView);
imageView = new ImageView(this);
imageView.setImageResource(R.drawable.a3);
imageScrollView.addView(imageView);
imageView = new ImageView(this);
imageView.setImageResource(R.drawable.a4);
imageScrollView.addView(imageView);
imageView = new ImageView(this);
imageView.setImageResource(R.drawable.a5);
imageScrollView.addView(imageView);
imageView = new ImageView(this);
imageView.setImageResource(R.drawable.a6);
imageScrollView.addView(imageView);
pageControlView = (PageControlView) this.findViewById(R.id.myPageControlView);
/** 設置圓圈的數量 **/
pageControlView.setCount(imageScrollView.getChildCount());
/** 初始化圓圈 **/
pageControlView.generatePageControl(0);
/** 設置視圖切換回調函數實現 **/
imageScrollView.setScrollToScreenCallback(pageControlView);
}
}
ImageScrollView
Java代碼 收藏代碼
package org.wp.activity;
import android.content.Context;
import android.util.AttributeSet;
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 ImageScrollView extends ViewGroup {
/** 滾動對象Scroller **/
private Scroller scroller = null;
/** 手勢識別對象GestureDetector **/
private GestureDetector gestureDetector = null;
/** 當前屏幕索引 **/
private int currentScreenIndex = 0;
/** 設置一個標志位,防止底層的onTouch事件重复處理UP事件 **/
private boolean fling = false;
public ImageScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
/** 設置布局,將子視圖順序橫屏排列 **/
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
child.setVisibility(View.VISIBLE);
child.measure(right - left, bottom - top);
child.layout(i * getWidth(), 0, (i + 1) * getWidth(), getHeight());
}
}
/** 初始化 **/
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 && getScrollX() < getWidth() * (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) {
// 判斷是否達到最小輕松速度,取絕對值的
if (Math.abs(velocityX) > ViewConfiguration.get(context)
.getScaledMinimumFlingVelocity()) {
if (velocityX > 0 && currentScreenIndex > 0) {
fling = true;
scrollToScreen(currentScreenIndex - 1);
} else if (velocityX < 0 && currentScreenIndex < getChildCount() - 1) {
fling = true;
scrollToScreen(currentScreenIndex + 1);
}
}
return true;
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
});
}
/** 切換到指定屏 **/
public void scrollToScreen(int whichScreen) {
if (whichScreen != currentScreenIndex && getFocusedChild() != null
&& 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 (scrollToScreenCallback != null) { // 刷新圓圈
scrollToScreenCallback.callback(currentScreenIndex);
}
}
@Override
public void computeScroll() {
// 當滾動沒有完成
if (scroller.computeScrollOffset()) {
scrollTo(scroller.getCurrX(), 0);
postInvalidate();
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
gestureDetector.onTouchEvent(event);
if (event.getAction() == MotionEvent.ACTION_UP) {
if (!fling) {
// 當用戶停止拖動
snapToDestination();
}
fling = false;
}
return true;
}
/** 根據當前x坐標位置確定切換到第幾屏 **/
private void snapToDestination() {
scrollToScreen((getScrollX() + (getWidth() / 2)) / getWidth());
}
/** 底部圓圈顯示回調接口 **/
interface ScrollToScreenCallback {
public void callback(int currentIndex);
}
/** ScrollToScreenCallback回調對象 **/
private ScrollToScreenCallback scrollToScreenCallback;
/** 設置回調函數對象 **/
public void setScrollToScreenCallback(ScrollToScreenCallback scrollToScreenCallback) {
this.scrollToScreenCallback = scrollToScreenCallback;
}
}
PageControlView
Java代碼 收藏代碼
package org.wp.activity;
import org.wp.activity.ImageScrollView.ScrollToScreenCallback;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class PageControlView extends LinearLayout implements
ScrollToScreenCallback {
/** Context對象 **/
private Context context;
/** 圓圈的數量 **/
private int count;
public PageControlView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
/** 回調函數 **/
@Override
public void callback(int currentIndex) {
generatePageControl(currentIndex);
}
/** 設置選中圓圈 **/
public void generatePageControl(int currentIndex) {
this.removeAllViews();
for (int i = 0; i < this.count; i++) {
ImageView iv = new ImageView(context);
if (currentIndex == i) {
iv.setImageResource(R.drawable.page_indicator_focused);
} else {
iv.setImageResource(R.drawable.page_indicator);
}
this.addView(iv);
}
}
/** 設置圓圈數量 **/
public void setCount(int count) {
this.count = count;
}
}
main.xml
Xml代碼 收藏代碼
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<org.wp.activity.ImageScrollView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/myImageScrollView" />
<org.wp.activity.PageControlView android:layout_width="fill_parent"
android:layout_height="40dip"
android:layout_alignParentBottom="true"
android:background="#8f00000f"
android:gravity="center"
android:id="@+id/myPageControlView" />
</RelativeLayout>
- Oct 02 Tue 2018 09:39
Android 自定義滾動視圖
全站熱搜
留言列表