Android:自定义视图会绘制

时间:2017-09-05 13:45:12

标签: android canvas drawing android-view

所以我知道有很多这样的问题,但没有一个答案产生任何影响。

我有一个自定义View,我试图将其放入ScrollView(所有程序设计)。 ScrollView本身工作正常,它需要做什么,做它应该做什么,当通过向它添加TextView进行测试时,仍然按照它应该做的那样。

然而,当我创建自定义View时,视图不会绘制,就好像什么都没有。永远不会调用draw(Canvas canvas)方法(即使我不知道有什么不同但它仍然无效),也尝试使用onDraw

我在构造函数中尝试了setWillNotDraw(false)之类的东西,每当我想要绘制/重绘时都会调用View.invalidate(),似乎没有任何东西可以正常工作。

以下是相关代码:

ScrollView已初始化

sv = new ScrollView(env.getContext());
ScaledBounds sb = UsefulMethods.getScaledBounds(50, 200, BBEnvironment.WIDTH - 100, BBEnvironment.HEIGHT - 300);

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(sb.getWidth(), sb.getHeight());
sv.setTranslationX(sb.getX());
sv.setTranslationY(sb.getY());
sv.setLayoutParams(params);
sv.setScrollbarFadingEnabled(false);
sv.setScrollBarSize(0);
sv.setBackgroundColor(Color.argb(150, 0, 255, 0));

自定义视图类

private class LevelSelectionView extends View {
    private ArrayList<LevelButton> levelButtons;

    public LevelSelectionView(Context context) {
        super(context);
        levelButtons = new ArrayList<LevelButton>();
        int x = 20;
        int y = 20;
        for(int i = 0; i < 20; i++) {
            levelButtons.add(new LevelButton(x, y, 100, 100, 10, i + 1));
            levelButtons.get(i).unlock();
            x += 100 + 20;
        }

        setWillNotDraw(false);
    }

    public void draw(Canvas canvas) {
        super.draw(canvas);

        System.out.println("is being called"); //except it isn't
        Paint paint = new Paint();
        paint.setAntiAlias(env.getCurrentSettings().getAntialias());

        for(LevelButton lb : levelButtons)
            lb.drawObject(canvas, paint);
    }
}

创建和添加自定义视图

LevelSelectionView lsView = new LevelSelectionView(sv.getContext());
lsView.setLayoutParams(new RelativeLayout.LayoutParams(sv.getLayoutParams().width, 1000));
lsView.setBackgroundColor(Color.argb(150, 0, 0, 255));
sv.addView(lsView);

为什么不画画?如何画画?

2 个答案:

答案 0 :(得分:0)

我尝试了这样,它的确有效:

public class LevelSelectionView extends View {
    private final static String TAG = LevelSelectionView.class.getSimpleName();

    private final ArrayList<Button> mButtons;
    private final Paint mPaint;

    public LevelSelectionView(Context context) {
        super(context);
        mButtons = new ArrayList<Button>();
        int x = 20;
        int y = 20;

        mPaint = new Paint();
//        mPaint.setAntiAlias(env.getCurrentSettings().getAntialias());


        Button myButton;

        for (int i = 0; i < 20; i++) {
            myButton = new Button(context);
            myButton.setLayoutParams(new ViewGroup.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.MATCH_PARENT));


            mButtons.add(myButton);
//            mButtons.get(i).unlock();
//            x += 100 + 20;
        }

        setWillNotDraw(false);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        for (Button lb : mButtons)
            Log.d(TAG, "is being called"); //except it isn't
//            lb.drawObject(canvas, mPaint);
    }
}

我不知道你的LevelButton是什么,因为它是一个自定义类。 我使用FrameLayout创建了类似的LevelSelectionView,但它与ScrollView的想法相同:

FrameLayout container = (FrameLayout) findViewById(R.id.container);

LevelSelectionView view = new LevelSelectionView(this);
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

container.addView(view);

也许您的问题来自LevelButton或您使用的上下文(因为您使用env创建ScrollView和ScrollView的Context来创建自定义类)。您的代码不清楚,因为我们不知道您的env对象是什么,因为您的所有类都是内部类。

答案 1 :(得分:0)

看起来您需要正确实现onMeasure,以便scrollview知道该视图的高度。