横向TimePicker-带三角指示器
值得推荐的活动:1.写博客推荐高薪工作 写博客送小米2代&魅族MX
3.关注http://weibo.com/u/2975543812得好礼
插件比较复杂,先描述下功能。
1.可横向滚动
2.数值可自定义。
3.要求有三角指示器,指向当前焦点
4.点击后焦点改变,并且三角指示器可滑动变化
5.焦点滚动至最左或最右时不消失(这里使用新的view获取焦点view的值悬浮显示,滚动条中的view已经还是滚动消失了)
上效果图,上面使用ImageView作为子View,下面使用TextView作为子View。

布局说明:
1.底部滚动条TimeBar继承自HorizontalScrollView,在onDraw()中添加三角指示器(三角滑块)绘制代码,使指示器随焦点滑动。
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
//Log.d("Validated!", "Should not always validate");
if (mSelectedView != null){
int step = getWidth()/30;
canvas.drawColor(Color.BLACK);
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.LTGRAY);
paint.setStyle(Paint.Style.FILL);
if (curTriangle == null){
curTriangle = new Triangle(
mSelectedView.getLeft() + mSelectedView.getWidth()/2 - 10,
mSelectedView.getTop() - 4,
mSelectedView.getLeft() + mSelectedView.getWidth()/2 + 10,
mSelectedView.getTop() + 13.3f
);
}
if (tarTriangle == null){
tarTriangle = new Triangle(
mSelectedView.getLeft() + mSelectedView.getWidth()/2 - 10,
mSelectedView.getTop() - 4,
mSelectedView.getLeft() + mSelectedView.getWidth()/2 + 10,
mSelectedView.getTop() + 13.3f
);
}
if (Math.abs(curTriangle.left - tarTriangle.left) < step) {
curTriangle.left = tarTriangle.left;
curTriangle.right = tarTriangle.right;
curTriangle.reDraw();
}
if (curTriangle.left > tarTriangle.left){
curTriangle.left -= step;
curTriangle.right -= step;
curTriangle.reDraw();
invalidate();
}
else if (curTriangle.left < tarTriangle.left) {
curTriangle.left += step;
curTriangle.right += step;
curTriangle.reDraw();
invalidate();
}
canvas.drawPath(curTriangle.getPath(), paint);
}
}
}
2.左右各添加一个TimePanel,继承自LinearLayout,重载onDraw()方法, 绘制出三角指示器,相对于上面的绘制代码较简单,不需要处理滑动情况,仅绘制出三角即可。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.BLACK);
paint.setColor(Color.LTGRAY);
paint.setStyle(Paint.Style.FILL);
if (curTriangle == null){
curTriangle = new Triangle(
mTextView.getLeft() + mTextView.getWidth()/2 - 10,
mTextView.getTop() - 4,
mTextView.getLeft() + mTextView.getWidth()/2 + 10,
mTextView.getTop() + 13.3f
);
}
canvas.drawPath(curTriangle.getPath(), paint);
}
3.TimePicker作为一个容器,容纳TimeBar和左右各一的TimePanel,重载onDraw()方法,在其中加入TimePanel显示和隐藏的判断条件。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int x = timeBar.getScrollX();
focusedBtn = (TextView)timeBar.getSelectedView();
if (focusedBtn != null){
if (focusedBtn.getLeft() - x < 0){
((TextView)timePanelLeft.getChildTextView()).setText(focusedBtn.getText());
timePanelLeft.setVisibility(View.VISIBLE);
timePanelRight.setVisibility(View.GONE);
} else if (focusedBtn.getRight() - x > getWidth()){
((TextView)timePanelRight.getChildTextView()).setText(focusedBtn.getText());
timePanelRight.setVisibility(View.VISIBLE);
timePanelLeft.setVisibility(View.GONE);
} else{
timePanelRight.setVisibility(View.GONE);
timePanelLeft.setVisibility(View.GONE);
}
}
}
4.仍需重载TimePicker中的dispatchTouchEvent (ev),将点击事件传递给timeBar,否则会发现timeBar无法响应点击事件。
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
timeBar.onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
| 安卓巴士广州群252743081 安卓巴士广州超级群218251417 安卓巴士南京群 220818530 安卓巴士上海群252742977 安卓巴士深圳群252742753(已满) 安卓巴士深圳群之二 260134856 安卓巴士成都群 252743807 安卓巴士北京群111059554 安卓巴士西安群252746034 安卓巴士武汉群121592153 安卓巴士杭州群253603803 安卓巴士厦门群253604146 安卓巴士湖南群217494504 安卓巴士大连群253672904 安卓巴士青岛群 257925319 |

浙公网安备 33010602011771号