Android的自定义布局 - 的onDraw()不会被调用(Android Custom Layo

2019-06-18 14:57发布

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TableView tv = new TableView(this);
        tv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
        setContentView(tv);      
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

public class TableView extends ViewGroup {
    private Paint oval;
    private RectF rect;

    public TableView(Context context) {
        super(context);
        oval= new Paint(Paint.ANTI_ALIAS_FLAG);
        oval.setColor(Color.GREEN);
    }


    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawOval(rect , oval);
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int wspec = MeasureSpec.makeMeasureSpec(
                getMeasuredWidth(), MeasureSpec.EXACTLY);
        int hspec = MeasureSpec.makeMeasureSpec(
                getMeasuredHeight(), MeasureSpec.EXACTLY);
        for(int i=0; i<getChildCount(); i++){
            View v = getChildAt(i);
            v.measure(wspec, hspec);
        }
    }


    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        float w=r-l;
        float h=b-t;
        rect=new RectF(w/8,h/8,7*w/8,7*h/8);
        float theta = (float) (2 * Math.PI / getChildCount());
        for(int i=0; i< getChildCount(); i++) {
            View v = getChildAt(i);
            w = (rect.right-rect.left)/2;
            h = (rect.bottom-rect.top)/2;
            float half = Math.max(w, h)/2;
            float centerX = rect.centerX()+w*FloatMath.cos(theta);
            float centerY = rect.centerY()+h*FloatMath.sin(theta);
            v.layout((int)(centerX-half),(int)(centerY-half),(int)(centerX+half),(int)(centerY+half));
        }
    }
}

那么有几乎没有良好而深刻的教程,几乎任何一块如何做自定义布局正确的数据,所以我试图找出它怎么做,我想实现的是,在中心描绘了一个绿色椭圆形布局屏幕的,我想这个布局的每一个孩子都能绕椭圆形来奠定的。

你可以认为那是椭圆形,我想这个布局的儿童座位周围牌桌上的。

目前哪些这段代码的情况是,我得到没有椭圆形白色应用scren,所以我调试它,看到的onDraw不会被调用...

3个问题:

  1. 为什么onDraw有没有得到叫什么名字?
  2. 该SDK警告我说,我不应该分配onLayout方法中的新对象,所以我应该在哪里计算RectF所以它是准备好了的onDraw电话来吗?
  3. 并调用super.onDraw()就可以把所有的孩子画自己? 或者我应该明确地调用它们的平局()?

如果我得到了这一切错了,你们可以指导我在正确的方向,或有与此相关的课题,将是有益的太例子或教程的任何链接!

Answer 1:

默认情况下, onDraw()不会调用ViewGroup对象。 相反,您可以覆盖dispatchDraw()

或者,您可以启用ViewGroup通过调用绘制setWillNotDraw(false)在你TableView构造。

编辑:

#2: -初始化它在构造函数中,则只需调用rect.set()在你的onLayout()方法。

对于#3: - 是的,据我所知超级调用将处理它,你不应该来处理,除非你需要自定义的方式,孩子们绘制。



Answer 2:

如果您想要的画布是要重新绘制调用无效(),该方法的onDraw()将被重新执行



文章来源: Android Custom Layout - onDraw() never gets called