我正在为android编写一个Java应用程序,在画布上绘制实心圆圈形状。
我已经编写了一个绘制圆的类来处理事件和圆的实际绘制:
公共类drawCircles扩展了android.support.v7.widget.AppCompatImageView {
float x, y;
Paint paint = new Paint();
PointF pointf = new PointF();
ArrayList<PointF> locations = new ArrayList<PointF>();
public drawCircles(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
x = event.getX();
y = event.getY();
pointf = new PointF(x, y);
locations.add(pointf);
invalidate();
return true;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Random rand = new Random();
int n = rand.nextInt(4) + 1;
switch(n)
{
case 1:
paint.setColor(GREEN);
break;
case 2:
paint.setColor(RED);
break;
case 3:
paint.setColor(YELLOW);
break;
case 4:
paint.setColor(BLUE);
break;
}
int i=0;
while(i < locations.size())
{
canvas.drawCircle(locations.get(i).x,locations.get(i).y,50, paint);
i = i + 1;
}
}}
公共类MainActivity扩展了AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
drawCircles draw = new drawCircles(this);
setContentView(draw);
}}
只要将main活动的onCreate()方法中的setContentView方法设置为drawCircles类的对象,我的应用程序就可以正常工作
我的问题是,当您将setContentView指向这样一个类的实例时,是否可以自定义布局?我想添加画笔大小等小工具。
我的第一个想法是将内容视图设置为一个定制的xml文件,然后在适当的地方调用drawCircle类中的方法。但是,如果我理解我所做的读取是正确的,那么从没有扩展视图的类中调用onDraw()方法是不可能的,所以我不能从扩展activity类的主类中调用它们来实现向后兼容性。
我突然想到,可以为drawCircles类分配一个特定的layout.xml文件,但我还没有找到这样做的任何情况。
任何建议都非常感谢。
发布于 2018-03-19 05:39:31
无论采用哪种方式,您都可以对视图执行任何操作。这两个函数运行相同的代码-接受布局标识符的函数只是将布局膨胀为视图,然后对结果调用setContentView。
也可以在xml中放置一个自定义视图,在这种情况下,它的onDraw将被调用。我认为您不太了解xml膨胀是如何工作的,这使得很难弄清楚如何帮助您。
此外,您永远不会直接调用onDraw。当一个视图有一个无效的区域时,它被框架调用。
发布于 2018-03-19 11:51:05
是的,你可以,让我们看看一些定制库,比如自定义对话框,日历,……它们为属性定义了许多情况。
在xml中,只需选择属性值,然后自定义视图类将执行所有操作。
你需要做的第一件事是学习更多关于自定义视图,收集属性,设置条件...让我们来看一些示例:
http://www.vogella.com/tutorials/AndroidCustomViews/article.html
http://trickyandroid.com/protip-inflating-layout-for-your-custom-view/https://stackoverflow.com/questions/49353044
复制相似问题