自定义view:有如下三种方式实现:1.组合自定义view。2.继承重写的自定义view 3.绘制的自定义view
公司要制作一个滚动的刻度尺:
我第一个想到的事情是怎么弄刻度了
很快我决定用第三个方案:
1.绘制自定义view
1>在onDraw()里面绘制刻度尺
2>在computeScroll()中编写滑动过载后还可以滑动的距离
3>在onTouch()中ActionUp 判断可以过载的距离
public class HScrollView extends View {
private Paint mLinePaint;
private Paint mShortLinePaint;
/** The scroller. */
private Scroller scroller;
private HScrollViewLister mHScrollViewLister;
private float currutX;
private float currutY;
/** The last scroll y. */
private float lastX;
private float lastY;
/**
* @Fields scale_Mumx Description刻度数量
*/
private int scale_Nums;
/**
* @Fields scale_Num_Width Description:带数据刻度矩形的宽度
*/
private final float scale_Num_Rect_Width = 3;
/**
* @Fields scale_Max Description:刻度范围最大值
*/
private int value_Scale_Max = 10;
/**
* @Fields scale_Min Description:刻度范围最小值
*/
private int value_Scale_Min = 0;
/**
* @Fields value_Scale_Little Description:小刻度取值范围
*/
private int value_Scale_Little = 2;
/**
* @Fields scale_Num_Space_Little Description:小刻度的间隔值
*/
private int scale_Num_Space_Little = 5;// 1\2\5
/**
* @Fields scale_Num_Space Description:数据刻度的间隔
*/
private int scale_Num_Space_Big = 10;
/**
* @Fields Start_Offset_X Description:绘制刻度的起始点X位置
*/
private final int Start_Offset_X = 0;// 开始点的起初X位置
/**
* @Fields total_Width Description:view的总长
*/
private float total_Width = 0;
/**
* @Fields screen_Width Description:当前屏幕宽度
*/
private int screen_Width;
public HScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
init(context);
}
public HScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
init(context);
}
public HScrollView(Context context) {
super(context);
// TODO Auto-generated constructor stub
init(context);
}
public float getLastX() {
return lastX;
}
public float getLastY() {
return lastY;
}
public void setmHScrollViewLister(HScrollViewLister mHScrollViewLister) {
this.mHScrollViewLister = mHScrollViewLister;
}
private void init(Context context) {
// TODO Auto-generated method stub
scroller = new Scroller(context);
DisplayMetrics displayMetrics = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay()
.getMetrics(displayMetrics);
screen_Width = displayMetrics.widthPixels;
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
mLinePaint = new Paint();
mLinePaint.setColor(Color.WHITE);
int width = getWidth();
int position = 0;
int localvalue = 0;
setBackgroundColor(Color.BLACK);
for (int i = value_Scale_Min * 10; i <= value_Scale_Max * 10; i++) {
localvalue = i - value_Scale_Min;
if (i % 10 == 0) {
Rect r = new Rect();
r.set(15 * localvalue + Start_Offset_X, 5, 15 * localvalue + 3
+ Start_Offset_X, 45);
canvas.drawRect(r, mLinePaint);
mLinePaint.setTextSize(18.0f);
if (i < 10) {
position = 15 * localvalue - 5;
} else if (i < 100) {
position = 15 * localvalue - 7;
} else {
position = 15 * localvalue - 10;
}
canvas.drawText(String.valueOf(i / 10), position, 60,
mLinePaint);
scale_Nums++;
} else if (i % scale_Num_Space_Little == 0) {
canvas.drawLine(15 * localvalue + Start_Offset_X, 10, 15
* localvalue + Start_Offset_X, 25, mLinePaint);
scale_Nums++;
}
}
total_Width = (value_Scale_Max - value_Scale_Min) * 15 * 10;
if (total_Width > screen_Width) {
total_Width += Start_Offset_X;
}
Log.i("total_Width", "total_width:" + total_Width + ",lastX:" + lastX);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int width = widthSize;// calculateLayoutWidth(widthSize, widthMode);
int height = heightSize;
setMeasuredDimension(width, height);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = event.getX();
lastY = event.getY();
return true;
case MotionEvent.ACTION_MOVE:
float newX = event.getX();
float newY = event.getY();
scrollBy((int) ((lastX - newX) * 2), 0);
lastX = newX;
lastY = newY;
if (mHScrollViewLister != null) {
mHScrollViewLister.onScroller(getLastX(), getScrollY());
}
Log.i("Move", ",右 :" + getScrollX() + ",左:" + lastY);
break;
case MotionEvent.ACTION_UP:
int scrollX = getScrollX();
int scrollY = getScrollY();
Log.i("up",
"scrollX: " + scrollX + ",右 :" + (lastX + screen_Width / 2)
+ ",左:" + Math.round(-screen_Width / 2));
// x轴向左可以过载的距离
if (scrollX < Math.round(-screen_Width / 2)) {
scroller.setFinalX(Math.round(-screen_Width / 2));
// scroller.startScroll(scrollX, 0, -scrollX, 0);
invalidate();
} else if (scrollX > total_Width - screen_Width * 5 / 6) {
// x轴向右滚动可以过载的距离
// scroller.startScroll(scrollX, 0, -scrollX / 2, 0);
scroller.setFinalX((int) (total_Width - screen_Width / 2));
invalidate();
}
else{
// Float x = new Float(scroller.getCurrX());
// float xx = 0.0f;
// for(Float l : xPosList){
// if(l.isInfinite(x)){
// xx = l;
// break;
// }
// }
// scroller.setFinalX((int) xx);
}
break;
default:
break;
}
return super.onTouchEvent(event);
}
@Override
public void computeScroll() {
if (scroller.computeScrollOffset()) {
// 调用这个下面的条件是由于scroller调用了滑动从而使它激发
scrollTo(scroller.getCurrX() + 25, scroller.getCurrY());
invalidate();
return;
}
super.computeScroll();
}
public interface HScrollViewLister {
void onScroller(float x, float y);
}
}
实现效果如下:
待解决问题:
1.由于是绘制的view ,view长度与宽度是无限的。计算移动的距离与坐标的关系,像素与间距的计算。