(一)使用自定义组合控件+ValueAnimator制作一个可自增页数的页码View
程序员文章站
2022-05-04 23:35:01
...
1.继承关系
继承自FrameLayout 和实现点击,长按和触摸事件的接口
其实已经自己写了点击和长按事件还要继承这些接口是为了调用方便 …
其实是起名字太烦了 滑稽…
public class PageNumberView extends FrameLayout implements View.OnClickListener,View.OnTouchListener ,View.OnLongClickListener
2.LayoutInflater加载xml
LayoutInflater.from(context).inflate(R.layout.page_number_view, this, true);
3.postDelayed发送一段延时执行代码实现长按事件
由于需要监听长按抬起时的事件所以这里自己实现了长按和点击的效果
mLongPressRunnable = new Runnable() {
@Override
public void run() {
performLongClick();
if (view!=null){
isLongClick=true;
onLongClick(view);
}
}
};
4.核心Touch事件处理和动画实现自增效果
这里逻辑众多我已经写好了注释
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 记录按下坐标
mX = x;
mY = y;
// 初始化操作符
isMoved = false;
isLongClick=false;
isDown=true;
// 记录按下的view
view=v;
postDelayed(mLongPressRunnable, ViewConfiguration.getLongPressTimeout());
break;
case MotionEvent.ACTION_MOVE:
if(isMoved) break;
if(Math.abs(mX -x) > TOUCH_MOVE || Math.abs(mY -y) > TOUCH_MOVE) {
//移动超过阈值,则表示移动了
isMoved = true;
removeCallbacks(mLongPressRunnable);
view=null;
}
break;
case MotionEvent.ACTION_UP:
//释放
removeCallbacks(mLongPressRunnable);
if (isDown&&!isLongClick&&!isMoved)onClick(v);
if (anim!=null)anim.cancel();
isDown=false;
view=null;
isMoved=false;
break;
}
return true;
}
动画这里使用ValueAnimator的ofInt方法并设置监听回调
private void startAnim(int start, int end ) {
anim = ValueAnimator.ofInt(start, end);
anim.setDuration(3000);
// 数值动画回调监听
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
if (isDown){
number =(int) valueAnimator.getAnimatedValue();
tvCenter.setText(number+"/"+maxNumber);
}else {
listener.OnLongStopping(number);
if (anim!=null){
anim.cancel();
}
}
}
});
anim.start();
}
第一次写博客可能写的不太清楚如果有需求大家可以去我的git仓库
下一篇: SQL 模糊查询