2017-09-05 66 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所以滾動視圖知道有多高的視圖。