做安卓开发的话,不会自定义view是不行的,自定定义各种控件以满足开发需求,在开发中是很重要的,自定义view通过继承view,通过重写ondraw方法实现重绘自己所需要的控件样式。
在ondraw方法中,通过canvas来绘制想要的样式,首先需要定义好画笔,以及画笔的各种属性,比如需要的时候要抗锯齿等等。都准备好了就可以用canvas来实现绘图了,当然api提供的api肯定是不够用的,需要多姿多彩的样式很多时候需要借助准备好的一些,通过canvas绘制bitmap来实现把准备好的绘制上去。绘制好了当然还是不够的,控件都是需要和用户交互的,所以很多时候样式是会发生改变的,所以要在其中定义相关方法暴露出来,方法中处理用户 *** 作或其他的结果改变样式的重绘,绘制好了调用更新(invalidate())方法,实现样式的改变。做好一个控件还需要优化性能等等,都需要一步一慢慢实现。
实例化一个画笔类 Paint,给画笔设置颜色,drawPath的时候将画笔穿进去就行了。比如:Paint paint = new Paint();paintsetColor(ColorBLACK);canvasdrawPath(path, paint);如果你要画实心的,那么你只能先画一个实心的,然后改变颜色,再画一个空心的,需要画二次,来实现实心带边线的图形,没有别的办法。
1 在xml布局文件中定义可滚动的View,例如ScrollView、RecyclerView等。
2 在Java代码中获取该View,并为其设置OnTouchListener监听器,在触摸事件中处理滑动逻辑。
3 在OnTouchListener监听器的onTouch()方法中,根据手指移动距离计算出需要滚动的距离,并调用View的scrollBy()方法进行滚动。
4 为了模拟阻尼效果,在手指抬起时需要判断是否到达边缘位置,并使用EdgeEffect类来模拟反d效果。具体实现可以参考以下示例代码:
```java
final EdgeEffect mEdgeEffectTop = new EdgeEffect(context);
final EdgeEffect mEdgeEffectBottom = new EdgeEffect(context);
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (eventgetActionMasked()) {
case MotionEventACTION_DOWN:
// 记录按下位置等信息
break;
case MotionEventACTION_MOVE:
// 根据手指移动距离计算需要滚动的距离
int dy = (int) (mLastY - eventgetY());
if (dy > 0 && canScrollUp()) { // 向上滑并且还能继续向上滑
scrollBy(0, dy);
invalidate();
} else if (dy < 0 && canScrollDown()) { // 向下滑并且还能继续向下滑
scrollBy(0, dy);
invalidate();
}
// 记录最后一次触摸点坐标
mLastY = eventgetY();
break;
case MotionEventACTION_UP:
case MotionEventACTION_CANCEL:
if (!mScrollerisFinished()) {
mScrollerabortAnimation();
}
int finalY = getScrollY();
if (finalY < 0) {
mEdgeEffectToponPull(Mathabs(finalY) / getHeight());
postInvalidateOnAnimation();
} else if (finalY > getMaxScrollY()) {
mEdgeEffectBottomonPull(Mathabs(finalY - getMaxScrollY()) / getHeight());
postInvalidateOnAnimation();
}
break;
}
return true;
}
@Override
protected void onDraw(Canvas canvas) {
superonDraw(canvas);
if (!mEdgeEffectTopisFinished()) {
final int restoreCount = canvassave();
canvastranslate(getPaddingLeft(), Mathmin(0, getScrollY()));
mEdgeEffectTopsetSize(getWidth() - getPaddingLeft() - getPaddingRight(), getHeight());
if(mEdgeEffectTopdraw(canvas)){
postInvalidateOnAnimation();
}
canvasrestoreToCount(restoreCount);
}
if (!mEdgeEffectBottomisFinished()) {
final int restoreCount = canvassave();
canvastranslate(-getWidth() + getPaddingRight(), Mathmax(getMaxScrollY(), getScrollY()));
canvasrotate(180, getWidth() - getPaddingRight(), 0);
mEdgeEffecBottomsetSize(getWidth() - getPaddingLeft() - getPaddingRight(), getHeight());
if(mEedgeEffecBottomdraw(canvas)){
postInvalidateOnAnimation();
}
canvasrestoreToCount(restoreCount);
}
}
```
其中,getMaxScrollY是获取View最大可垂直方向偏移量;canScrollUp和canSrollDown是判断当前是否还能向上或者向下进行有效的垂直方向位移。
以上就是关于android:如何用canvas在自定义view里画图全部的内容,包括:android:如何用canvas在自定义view里画图、android怎么把canvas、android上拖动view的阻尼edgeeffect效果等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)