android:如何用canvas在自定义view里画图 android canvas怎么画圆弧
android:如何用canvas在自定义view里画图
做安卓开发的话,不会自定义view是不行的,自定定义各种控件以满足开发需求,在开发中是很重要的,自定义view通过继承view,通过重写ondraw方法实现重绘自己所需要的控件样式。
在ondraw方法中,通过canvas来绘制想要的样式,首先需要定义好画笔,以及画笔的各种属性,比如需要的时候要抗锯齿等等。都准备好了就可以用canvas来实现绘图了,当然api提供的api肯定是不够用的,需要多姿多彩的样式很多时候需要借助准备好的一些图片,通过canvas绘制bitmap来实现把准备好的图片绘制上去。绘制好了当然还是不够的,控件都是需要和用户交互的,所以很多时候样式是会发生改变的,所以要在其中定义相关方法暴露出来,方法中处理用户操作或其他的结果改变样式的重绘,绘制好了调用更新(invalidate())方法,实现样式的改变。做好一个控件还需要优化性能等等,都需要一步一慢慢实现。
android canvas怎么画圆弧
12345
要实现这个方法,我们要传5个参数进去。
第一个参数:RectF oval
oval 参数的作用是:定义的圆弧的形状和大小的范围
/**
* 这是一个居中的圆
*/
float x = (getWidth() - getHeight() / 2) / 2
float y = getHeight() / 4
RectF oval = new RectF( x, y,
getWidth() - x, getHeight() - y) 1234567812345678
第二个参数:float startAngle
这个参数的作用是设置圆弧是从哪个角度来顺时针绘画的
canvas.drawArc(oval,-90,120,false,mPaint)11
canvas.drawArc(oval,90,110,false,mPaint)11
//设置为-180的时候也是这样
canvas.drawArc(oval,180,140,false,mPaint)1212
//设置为360的时候也是这样
canvas.drawArc(oval,0,140,false,mPaint)1212
第三个参数:float sweepAngle
这个参数的作用是设置圆弧扫过的角度
我们从上面的代码就可以知道其中的作用了
第四个参数:boolean useCenter
这个参数的作用是设置我们的圆弧在绘画的时候,是否经过圆形
值得注意的是,这个参数在我们的 mPaint.setStyle(Paint.Style.STROKE) 设置为描边属性的时候,是看不出效果的。
/**
*这里我是偷懒了,建议不要在onDraw()方法里初始化对象
*/
Paint p = new Paint()//这个是画矩形的画笔,方便大家理解这个圆弧
p.setStyle(Paint.Style.STROKE)
p.setColor(Color.RED)
mPaint.setAntiAlias(true)//取消锯齿
mPaint.setStyle(Paint.Style.FILL)//设置画圆弧的画笔的属性为描边(空心),个人喜欢叫它描边,叫空心有点会引起歧义
mPaint.setStrokeWidth(mCircleWidth)
mPaint.setColor(Color.CYAN)
/**
* 这是一个居中的圆
*/
float x = (getWidth() - getHeight() / 2) / 2
float y = getHeight() / 4
RectF oval = new RectF( x, y,
getWidth() - x, getHeight() - y)
canvas.drawArc(oval,360,140,false,mPaint)//画圆弧,这个时候,绘制没有经过圆心
canvas.drawRect(oval, p)//画矩形12345678910111213141516171819202122231234567891011121314151617181920212223
//当我们设置为true的时候,绘制的时候就经过圆心了
canvas.drawArc(oval,360,140,true,mPaint)1212
第五个参数:Paint paint
这个参数的作用是设置我们的画笔对象的属性
mPaint.setAntiAlias(true)//取消锯齿
mPaint.setStyle(Paint.Style.FILL)//设置画圆弧的画笔的属性为描边(空心),个人喜欢叫它描边,叫空心有点会引起歧义
mPaint.setStrokeWidth(mCircleWidth)
mPaint.setColor(Color.CYAN)12341234
这里还是要强调一下,当 p.setStyle(Paint.Style.STROKE)的时候,我们的第四个参数boolean useCenter,是看不到效果的。
下面是代码全文
public class CustomProgress extends View{
private Paint mPaint
/**
* 圆的宽度
*/
private int mCircleWidth = 3
public CustomProgress(Context context) {
this(context, null)
}
public CustomProgress(Context context, AttributeSet attrs) {
this(context, attrs, 0)
}
public CustomProgress(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr)
mPaint = new Paint()
}
@Override
protected void onDraw(Canvas canvas) {
mPaint.setAntiAlias(true)//取消锯齿
mPaint.setStyle(Paint.Style.FILL)
mPaint.setStrokeWidth(mCircleWidth)
mPaint.setColor(Color.CYAN)
/**
* 这是一个居中的圆
*/
float x = (getWidth() - getHeight() / 2) / 2
float y = getHeight() / 4
RectF oval = new RectF( x, y,
getWidth() - x, getHeight() - y)
canvas.drawArc(oval,360,140,true,mPaint)
}
android studio canvas 怎么用
我们可以把这个Canvas理解成系统提供给我们的一块内存区域(但实际上它只是一套画图的API,真正的内存是下面的Bitmap),而且它还提供了一整套对这个内存区域进行操作的方法,所有的这些操作都是画图API。也就是说在这种方式下我们已经能一笔一划或者使用Graphic来画我们所需要的东西了,要画什么要显示什么都由我们自己控制。
这种方式根据环境还分为两种:一种就是使用普通View的canvas画图,还有一种就是使用专门的SurfaceView的canvas来画图。两种的主要是区别就是可以在SurfaceView中定义一个专门的线程来完成画图工作,应用程序不需要等待View的刷图,提高性能。前面一种适合处理量比较小,帧率比较小的动画,比如说象棋游戏之类的;而后一种主要用在游戏,高品质动画方面的画图。
android自定义控件canvas画图问题
我是在activity里面对控件所在的relativelayout进行了scrollBy,这样就会出现绘制不出屏幕外的那部分,是因为控件限制了大小么?该怎么写比较好,这是我的拖动代码@Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: currentX = (int) event.getRawX() currentY = (int) event.getRawY() break case MotionEvent.ACTION_UP: break case MotionEvent.ACTION_MOVE: int x2 = (int) event.getRawX() int y2 = (int) event.getRawY() container.scrollBy(currentX-x2 , currentY-y2 ) currentX=x2 currentY=y2 metroView.invalidate() default: break } return super.onTouchEvent(event) }
android 使用canvas画线,如何保证快速画出圆滑的曲线?
原来一直以为canvas.drawText是根据给出的坐标做为左上角来画的,今天才发现给出的坐标是左下角坐标。canvas.drawText("HelloWorld!",50,110,paint)canvas.drawLine(50,110,150,110,paint)注意观察横线的开始位置
Android canvas 怎样隔一段距离画一个相同的图案
首先你要画好一个图;
比如 canvas.drawLine(50,100,100,100)//这个是在(x,y)50, 100 (x1,y1)100 ,100 的地方花了一条直线;
如果想要完成你那样的需求,只需要
横坐标 即 x、 x1 每次平移一定距离就可以了 复杂图案同理,平移所有x点坐标就行了