2017-09-05 4 views
0

Also ich weiß, es gibt eine Menge Fragen wie diese, aber keine der Antworten hatte irgendeine Wirkung.Android: Benutzerdefinierte Ansicht zeichnet

Ich habe eine benutzerdefinierte View, die ich versuche, in eine ScrollView (alle programmatisch) zu setzen. Die ScrollView selbst funktioniert gut, ist, wo es sein muss, tut, was es tun soll, und wenn es getestet wird, indem man eine TextView hinzufügt, tat es immer noch, was es sollte.

Allerdings, wenn ich meine benutzerdefinierte View erstellen die Zeichnung nicht und es ist, als ob nichts da ist. Die draw(Canvas canvas) Methode wird nie aufgerufen (auch mit onDraw versucht, obwohl ich nicht weiß, was der Unterschied ist, aber es hat immer noch nicht funktioniert).

Ich habe Dinge wie setWillNotDraw(false) im Konstruktor versucht, genannt View.invalidate() jedes Mal, wenn ich es zeichnen/neu zeichnen möchte, scheint nichts zu arbeiten.

Hier ist der relevante Code:

Scroll Initialized

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)); 

Benutzerdefinierte Ansicht Klasse

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); 
    } 
} 

Erstellen und Hinzufügen von benutzerdefinierten Ansicht

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); 

Warum zeichnet es nicht und wie bekomme ich es zu zeichnen?

+0

Wie haben Sie 'View' zu ScrollView hinzugefügt? Hast du versucht, die Farbe variabel zu setzen? Funktioniert die benutzerdefinierte Ansicht separat in XML? – emiraslan

+0

@emiraslan sieht aus wie ich etwas Code geschnitten habe. Die 'Ansicht' wird' 'ScrollView' 'mit' sv.addView (lsView) 'hinzugefügt. Hinweis: relevanten Code hinzugefügt – Ryan

+0

Sie sollten onDraw (Canvas) überschreiben anstatt zeichnen. Können Sie den Code hinzufügen, in dem Sie das CustomView erstellen und dem ScrollView hinzufügen? – Eselfar

Antwort

0

versuchte ich so, und es funktioniert:

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); 
    } 
} 

Ich weiß nicht, was Ihr LevelButton ist, da es eine eigene Klasse ist. Ich schaffe das LevelSelectionView so, ein FrameLayout verwenden, aber es ist die gleiche Idee mit dem Scroll:

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); 

Vielleicht kommt Ihr Problem aus dem LevelButton oder Kontext Sie (wie Sie den Kontext von env verwenden verwenden die erstellen ScrollView und der Kontext der ScrollView, um Ihre benutzerdefinierte Klasse zu erstellen). Ihr Code ist nicht klar, da wir nicht wissen, was Ihr env Objekt ist, da alle Ihre Klassen innere Klassen sind.

0

Es sieht so aus, als müssten Sie onMeasure richtig implementieren, damit der scrollview weiß, wie groß diese Ansicht ist.

Verwandte Themen