Android 为什么无效不起作用?
我正在尝试单击一个按钮并添加一个电阻器。因此,我需要的是在单击按钮时使视图无效。但是方法更新中MyView中的invalidate不起作用。我一直在试图寻找这个问题,但我没有发现任何类似于我试图做的事情,或者可能这不是解决问题的方法 DefaultActivity.java MyView.java 您应该使用视图组而不是SurfaceView。将电阻器视图作为子视图添加到MyView中,视图组将自动绘制它们Android 为什么无效不起作用?,android,android-custom-view,Android,Android Custom View,我正在尝试单击一个按钮并添加一个电阻器。因此,我需要的是在单击按钮时使视图无效。但是方法更新中MyView中的invalidate不起作用。我一直在试图寻找这个问题,但我没有发现任何类似于我试图做的事情,或者可能这不是解决问题的方法 DefaultActivity.java MyView.java 您应该使用视图组而不是SurfaceView。将电阻器视图作为子视图添加到MyView中,视图组将自动绘制它们 SurfaceView要求您在单独的线程中绘制。您必须在surfaceCreated中启
SurfaceView要求您在单独的线程中绘制。您必须在surfaceCreated中启动该线程,并根据需要继续重新绘制视图。对于像您发布的那样的简单视图,只在UI线程中绘制图形是完全可以接受的。不需要SurfaceView。我以前没有使用过SurfaceView,但如果您在中可以看到,SurfaceView类没有名为invalidate的函数 也许你可以设法重新使用这一行:
holder.unlockCanvasAndPost(c);
谢谢你的回答。我将尝试使用ViewGroup来了解它是如何工作的。所以,如果我想继续使用SurfaceView,我需要创建一个单独的线程?然后我就能做我想做的事情了?基本上,是的。例如,您可以创建一个具有无限循环的线程,该循环不断地重新绘制视图。不过,这对您的CPU来说显然是个坏消息。SurfaceView用于非常特殊的绘图需求,例如浏览器或地图,需要在通过背景线程渲染瓷砖后立即重新绘制瓷砖。您通常不需要它。实际上,这里您错了,因为SurfaceView扩展了视图,而继承的方法之一是invalidate。
public class MyView extends SurfaceView implements SurfaceHolder.Callback{
Resistor myResistor;
private ArrayList<Resistor> mElements = new ArrayList<Resistor>();
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
getHolder().addCallback(this);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
synchronized (mElements) {
for (Resistor element : mElements) {
element.doDraw(canvas);
}
}
}
public void update() {
mElements.add(new Resistor(getContext(), (int) 10, (int) 10));
invalidate(); //Does not work!
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Canvas c = holder.lockCanvas();
onDraw(c);
holder.unlockCanvasAndPost(c);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
}
public class Resistor extends View{
private Path mSymbol;
private Paint mPaint;
private int mX;
private int mY;
//...Override Constructors...
public Resistor(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public Resistor(Context context, int x, int y){
super(context);
mX = x;
mY = y;
init();
}
private void init() {
mSymbol = new Path();
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(2);
mPaint.setColor(-7829368);
mPaint.setStyle(Paint.Style.STROKE);
//...Your code here to set up the path,
//...allocate objects here, never in the drawing code.
mSymbol.moveTo(0.0F, 0.0F);
mSymbol.lineTo(0.0F, 50.0F);
mSymbol.lineTo(16.666666F, 58.333332F);
mSymbol.lineTo(-16.666666F, 75.0F);
mSymbol.lineTo(16.666666F, 91.666664F);
mSymbol.lineTo(-16.666666F, 108.33333F);
mSymbol.lineTo(16.666666F, 124.99999F);
mSymbol.lineTo(-16.666666F, 141.66666F);
mSymbol.lineTo(0.0F, 150.0F);
mSymbol.lineTo(0.0F, 200.0F);
mSymbol.offset(mX, mY);
}
public void doDraw(Canvas canvas) {
canvas.drawPath(mSymbol, mPaint);
}
holder.unlockCanvasAndPost(c);