看到网络上有个关于自定的页面控件,但没有实现和用户的交互。根据交互方式的不同,添加方法也多种多样。下面对横向的触碰做个简要说明,这个操作可以在 View里面完成,也可以在View外面完成。为了不修改原来的View代码,本例仅仅从View外部实现该操作,效果如图:
以下是View的自定义代码,来自 ,详情如下:
import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; public class PointPageView extends View { private int mPageSize; private int mPageIndex; private int mPointSize; private int mPointSpan; private int mSelectPointSize; private int mStep; private int mDisplaySize; private int mDisplayIndex; private Paint paint; private void init() { mPointSize = 3; mSelectPointSize = mPointSize; mPointSpan = 3 * mPointSize; mStep = 1; paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.WHITE); } public PointPageView(Context context) { super(context, null); init(); } /** * Used to inflate the Workspace from XML. */ public PointPageView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public void setPageSize(int pageSize) { mPageSize = Math.max(pageSize, 0); mDisplaySize = (int)Math.ceil((double)mPageSize / mStep); invalidate(); } public int getPageSize() { return mPageSize; } public void setPageIndex(int pageIndex) { mPageIndex = Math.min(Math.max(pageIndex, 0), mPageSize - 1); mDisplayIndex = (int)Math.floor((double)mPageIndex / mStep); invalidate(); } public int getPageIndex() { return mPageIndex; } public void setColor(int color) { paint.setColor(color); } public void setPointSize(int size) { mPointSize = size; } public void setSelectPointSize(int size) { mSelectPointSize = size; } public void setPointSpan(int span) { mPointSpan = span; } public void setStep(int step) { mStep = step; } public int getStep() { return mStep; } @Override public void draw(Canvas canvas) { super.draw(canvas); drawAllPoint(canvas); } private void drawAllPoint(Canvas canvas) { canvas.save(); final int paddingLeft = mPointSpan; final int width = getMeasuredWidth(); final int height = getMeasuredHeight(); int radius = mPointSize; int contentWidth = (radius + paddingLeft) * mPageSize; int beginX = (width - contentWidth) / 2; int beginY = height / 2; for (int i = 0; i < mDisplaySize; i++) { if (i == mDisplayIndex) { paint.setAlpha(255); radius = mSelectPointSize; } else { paint.setAlpha(128); radius = mPointSize; } canvas.drawCircle(beginX, beginY, radius, paint); beginX = beginX + radius + radius + paddingLeft; } canvas.restore(); } }
判断事件的代码比较简单,比较ACTION_DOWN和ACTION_UP之间X方向的值的变化的大小和方向判断是横向向左还是横向向右操作,进而更新自定义View的状态即可,详见代码:
import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; public class CustomizedViewActivity extends Activity implements OnTouchListener { private PointPageView pageView; /** 上次X坐标值 */ private float lastX; /** X方向变化的最小有效值 */ private static float MINIMUM_EFFECTIVE_DISTANCE = 10.0f; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); pageView = new PointPageView(this); pageView.setPageSize(5); pageView.setColor(Color.GREEN); pageView.setSelectPointSize(3); pageView.setPointSpan(20); pageView.setPageIndex(2); // 设置触摸监听器 pageView.setOnTouchListener(this); setContentView(pageView); } @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 在一次Touch循环中,初始化lastX值 lastX = event.getX(); break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: float currentX = event.getX(); if (currentX - lastX > MINIMUM_EFFECTIVE_DISTANCE) { // 向右 pageView.setPageIndex(getNextPageIndex()); } else if (currentX - lastX < -MINIMUM_EFFECTIVE_DISTANCE) { // 向左 pageView.setPageIndex(getPrePageIndex()); } break; case MotionEvent.ACTION_CANCEL: break; case MotionEvent.ACTION_OUTSIDE: break; default: break; } return true; } private int getPrePageIndex() { if (pageView != null) { int currentPageIndex = pageView.getPageIndex(); if (currentPageIndex == 0) { return currentPageIndex; } else { return currentPageIndex - 1; } } return 0; } private int getNextPageIndex() { if (pageView != null) { int count = pageView.getPageSize(); int currentPageIndex = pageView.getPageIndex(); if (currentPageIndex == count - 1) { return currentPageIndex; } else { return currentPageIndex + 1; } } return 0; } }
当然,利用MotionEvent中的其它信息可以构建更加复杂的屏幕触摸事件,比如:横向触摸滑动时的速度,加速度,平均速度等!:)