Java 如何创建可以在onDraw()方法上绘制的对象?
我试图创建一个对象,每当我想在我的类的onDraw()函数上绘制一些东西时,就可以调用它。以下是我的代码,它不起作用:Java 如何创建可以在onDraw()方法上绘制的对象?,java,android,android-canvas,ondraw,Java,Android,Android Canvas,Ondraw,我试图创建一个对象,每当我想在我的类的onDraw()函数上绘制一些东西时,就可以调用它。以下是我的代码,它不起作用: //object class public class DrawObject extends Canvas { Paint paint = new Paint(); public void setColor(int color){ paint.setColor(color); } // I want to draw an arrow to instead o
//object class
public class DrawObject extends Canvas {
Paint paint = new Paint();
public void setColor(int color){
paint.setColor(color);
}
// I want to draw an arrow to instead of a line
public void drawArrow(float startPointX, float startPointY, float endPointX, float endPointY){
drawLine(startPointX, startPointY, endPointX, endPointY, paint);
// draw the rest of the arrow here
}
}
对于主类:
public class Screen extends ImageView{
Paint paint = new Paint();
public Screen(Context context){
super(context);
paint.setColor(Color.BLACK);
paint.setStyle(Style.STROKE);
}
public void onDraw(DrawObject drawObject){
//called DrawObject instead on Canvas
drawObject.drawArrow(10,10,100,100);
// I want to draw the arrow here but it is not working.
}
有人能告诉我什么是正确的方法吗?谢谢。我真的不明白为什么要扩展
画布并定义自己的对象,除非您需要对其进行特殊控制
通常,通过Canvas
对象扩展View
并在onDraw()
方法中完成所有绘图工作,例如:
public void onDraw(Canvas canvas){
canvas.drawLine(startPointX, startPointY, endPointX, endPointY, paint);
}
我真的不明白为什么要扩展画布并定义自己的对象,除非您需要对其进行特殊控制
通常,通过Canvas
对象扩展View
并在onDraw()
方法中完成所有绘图工作,例如:
public void onDraw(Canvas canvas){
canvas.drawLine(startPointX, startPointY, endPointX, endPointY, paint);
}
扩展Canvas
是错误的方法,因为您必须使用系统提供的Canvas。你不能强迫Android使用你的Canvas
子类。相反,只要在类需要时将画布
传递给类即可
public class DrawObject {
Paint paint = new Paint();
public void setColor(int color) {
paint.setColor(color);
}
// I want to draw an arrow to instead of a line
public void drawArrow(Canvas canvas, float startPointX, float startPointY, float endPointX, float endPointY) {
canvas.drawLine(startPointX, startPointY, endPointX, endPointY, paint);
// draw the rest of the arrow here
}
}
和使用一样
public void onDraw(Canvas canvas){
drawObject.drawArrow(canvas, 10,10,100,100);
// I want to draw the arrow here but it is not working.
}
扩展Canvas
是错误的方法,因为您必须使用系统提供的Canvas。你不能强迫Android使用你的Canvas
子类。相反,只要在类需要时将画布
传递给类即可
public class DrawObject {
Paint paint = new Paint();
public void setColor(int color) {
paint.setColor(color);
}
// I want to draw an arrow to instead of a line
public void drawArrow(Canvas canvas, float startPointX, float startPointY, float endPointX, float endPointY) {
canvas.drawLine(startPointX, startPointY, endPointX, endPointY, paint);
// draw the rest of the arrow here
}
}
和使用一样
public void onDraw(Canvas canvas){
drawObject.drawArrow(canvas, 10,10,100,100);
// I want to draw the arrow here but it is not working.
}
这一点是错误的
public void onDraw(DrawObject drawObject){ ... }
onDarw是一种框架方法,因此只要更改方法签名,该方法将不会被调用
不需要对canvas进行子类化-这不是正确的方法
因此,在Screen类中-重写标准onDraw方法:
public void onDraw(Canvas c){
drawLine(startPointX, startPointY, endPointX, endPointY, paint);
}
要以编程方式触发onDraw方法,请在Screen对象上调用invalidate()。此位错误
public void onDraw(DrawObject drawObject){ ... }
onDarw是一种框架方法,因此只要更改方法签名,该方法将不会被调用
不需要对canvas进行子类化-这不是正确的方法
因此,在Screen类中-重写标准onDraw方法:
public void onDraw(Canvas c){
drawLine(startPointX, startPointY, endPointX, endPointY, paint);
}
要以编程方式触发onDraw方法,请在Screen对象上调用invalidate()
为可绘制对象定义一个接口(为了避免与安卓drawable
类混淆,我称之为Paintable
)
制作需要以自定义方式绘制的任何类,如建议的箭头,实现可绘制的
接口,覆盖绘制(画布)
,并在那里处理绘制操作
public class Arrow implements Paintable {
//all sorts of cool shit here to define your arrow
@Override
public void paint(Canvas canvas) {
//draw your arrow on the canvas here
}
}
在自定义的ImageView
中维护一个Paintable
对象列表,只需为列表中的每个对象调用paint()
方法即可。是的,多态性
public class Screen extends ImageView {
List<Paintable> paintableObjects;
public Screen(Context context) {
super(context);
paint.setColor(Color.BLACK);
paint.setStyle(Style.STROKE);
paintableObjects = new ArrayList<Paintable>();
}
public void addPaintable(Paintable p) {
paintableObjects.add(p);
}
public void onDraw(Canvas canvas) {
for(Paintable p : paintableObjects) {
p.paint(canvas);
}
}
}
公共类屏幕扩展了ImageView{
列出可绘制的对象;
公共屏幕(上下文){
超级(上下文);
油漆。设置颜色(颜色。黑色);
油漆.设置样式(样式.笔划);
paintableObjects=newarraylist();
}
公共空间可添加可绘制(可绘制p){
可绘制对象。添加(p);
}
公共空白onDraw(画布){
用于(可绘制p:可绘制对象){
p、 油漆(帆布);
}
}
}
实际上,我会按照以下思路做一些事情:
为可绘制对象定义一个接口(为了避免与安卓drawable
类混淆,我称之为Paintable
)
制作需要以自定义方式绘制的任何类,如建议的箭头,实现可绘制的
接口,覆盖绘制(画布)
,并在那里处理绘制操作
public class Arrow implements Paintable {
//all sorts of cool shit here to define your arrow
@Override
public void paint(Canvas canvas) {
//draw your arrow on the canvas here
}
}
在自定义的ImageView
中维护一个Paintable
对象列表,只需为列表中的每个对象调用paint()
方法即可。是的,多态性
public class Screen extends ImageView {
List<Paintable> paintableObjects;
public Screen(Context context) {
super(context);
paint.setColor(Color.BLACK);
paint.setStyle(Style.STROKE);
paintableObjects = new ArrayList<Paintable>();
}
public void addPaintable(Paintable p) {
paintableObjects.add(p);
}
public void onDraw(Canvas canvas) {
for(Paintable p : paintableObjects) {
p.paint(canvas);
}
}
}
公共类屏幕扩展了ImageView{
列出可绘制的对象;
公共屏幕(上下文){
超级(上下文);
油漆。设置颜色(颜色。黑色);
油漆.设置样式(样式.笔划);
paintableObjects=newarraylist();
}
公共空间可添加可绘制(可绘制p){
可绘制对象。添加(p);
}
公共空白onDraw(画布){
用于(可绘制p:可绘制对象){
p、 油漆(帆布);
}
}
}