所以我知道有很多这样的问题,但没有一个答案产生任何影响。
我有一个自定义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);
为什么不画画?如何画画?
答案 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知道该视图的高度。