2017-09-05 47 views
0

所以我知道有很多像这样的问题,但没有一个答案有任何效果。Android:自定义视图确实绘制了

我有一个自定义View,我试图将其放入ScrollView(全部以编程方式)。 ScrollView本身工作正常,是它需要的地方,做它应该做什么,并通过添加一个TextView进行测试,仍然做它应该的。

但是,当我创建我的自定义View视图不绘制,它就好像什么都没有。从来没有调用draw(Canvas canvas)方法(即使我不知道区别是什么,但它仍然不起作用,也尝试使用onDraw)。

我在构造函数中尝试了一些东西,如View.invalidate(),每次我想绘制/重绘时,没有任何东西显示正在工作。

下面是相关代码:

滚动型初始化

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

你是怎么给ScrollView添加view的?你有没有试图设置颜色来绘制变量?自定义视图是否在xml中单独运行? – emiraslan

+0

@emiraslan看起来像我削减了一些代码。使用'sv.addView(lsView)'将'View'添加到'ScrollView'中'注意:添加了相关代码 – Ryan

+0

您应该重写onDraw(Canvas)而不是绘制。你可以在你创建的地方添加代码,并将CustomView添加到ScrollView中。 – Eselfar

回答

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因为它是一个自定义类。 我创造这样的LevelSelectionView,使用的FrameLayout但它是同样的想法与滚动型:

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的上下文来创建你的自定义类)。您的代码不清楚,因为我们不知道什么是env对象,因为您的所有类都是内部类。

0

它看起来像你需要正确实施onMeasure所以滚动视图知道有多高的视图。