android:如何用canvas在自定义view里画图

android:如何用canvas在自定义view里画图,第1张

做安卓开发的话,不会自定义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效果等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9756027.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存