2011-07-19 6 views
1

Présentation: J'essaie de créer des formes simples (carrés et triangles), puis de les utiliser comme image d'arrière-plan pour une activité. Les tailles des formes dépendent de la largeur et de la hauteur de l'écran. Le problème est, même si je suis en train de fixer les limites de ces formes, elles sont toutes dessinées aussi grandes que possible tout en restant à l'intérieur de l'écran. Détails: J'essaie de créer une image d'arrière-plan très simple avec un couple de formes dans une classe de vue substituée appelée ControlsOverlayView.java. Je suis en train de déterminer la taille de la toile, puis d'appeler ma méthode de peinture dans la méthode onDraw, car c'est à ce moment-là que je sais à quel point la toile est grande. J'ai vérifié en faisant un pas à travers le code que chaque forme a les limites correctes, mais le problème est qu'aucune des formes n'obéissent à leurs limites, et chaque forme dessine aussi grande qu'elle peut aller sur l'écran.Où définir les limites d'un dessin dans une vue personnalisée

public class ControlsOverlayView extends View{ 

    // graphical constants 
    private static int SIDE_ARROW_WIDTH; 
    ... 
    ... 

    public ControlsOverlayView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     resize(canvas.getWidth(), canvas.getHeight()); 
     paintControls(); 
     super.onDraw(canvas); 
    } 

    private void resize(int width, int height) { 
     // initialize screen size 
     SCREEN_WIDTH = width; 
     SCREEN_HEIGHT = height; 

     HALF_WIDTH = SCREEN_WIDTH/2; 
     HALF_HEIGHT = SCREEN_HEIGHT/2; 

     SIDE_ARROW_HEIGHT = SCREEN_WIDTH/6; 
     SIDE_ARROW_WIDTH = SIDE_ARROW_HEIGHT/2; 

     // calculate constants 
     TEXT_FONT_HEIGHT = Utils.Font_getHeight(TEXT_FONT); 

     SCREEN_FRAMED_WIDTH = SCREEN_WIDTH-(2*FRAME_SIZE); 
     SCREEN_FRAMED_HEIGHT = SCREEN_HEIGHT-(2*FRAME_SIZE); 
    } 

    // Creates a background drawable for the control layout including the different coloured panels and the next page arrows 
    public void paintControls(){ 
     // Calculated layout values 
     int panelWidth = SIDE_ARROW_WIDTH*3, textViewHeight = (SCREEN_HEIGHT-SIDE_ARROW_HEIGHT)/2; 
     int leftArrowX = (SCREEN_WIDTH/8)+(SIDE_ARROW_WIDTH/3), rightArrowX = SCREEN_WIDTH-(SCREEN_WIDTH/4)+(SCREEN_WIDTH/8)-(SIDE_ARROW_WIDTH/3), arrowY = (SCREEN_HEIGHT/2)-(SIDE_ARROW_HEIGHT/2); 

     // Rect array that stores the bounds of each layer of the background 
     Rect [] bounds = new Rect[3]; 
     int i = 0; 

     // background 
     ShapeDrawable background = new ShapeDrawable(new RectShape()); 
     bounds[i++] = new Rect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT); 
     background.getPaint().setColor(CONTROLS_BACKGROUND_COLOR); 

     // left panel 
     ShapeDrawable leftPanel = new ShapeDrawable(new RectShape()); 
     bounds[i++] = new Rect(0, 0, panelWidth, SCREEN_HEIGHT); 
     leftPanel.getPaint().setColor(CONTROLS_PANEL_COLOR); 


     // right arrow 
     Path rightArrowPath = new Path(); 
     rightArrowPath.moveTo(SIDE_ARROW_WIDTH, SIDE_ARROW_HEIGHT/2); 
     rightArrowPath.lineTo(0, SIDE_ARROW_HEIGHT); 
     rightArrowPath.lineTo(0, 0); 
     rightArrowPath.lineTo(SIDE_ARROW_WIDTH, SIDE_ARROW_HEIGHT/2); 
     rightArrowPath.close(); 
     ShapeDrawable rightArrow = new ShapeDrawable(new PathShape(rightArrowPath, SIDE_ARROW_WIDTH, SIDE_ARROW_HEIGHT)); 
     bounds[i++] = new Rect(rightArrowX, arrowY, rightArrowX+SIDE_ARROW_WIDTH, arrowY+SIDE_ARROW_HEIGHT); 
     rightArrow.getPaint().setColor(CONTROLS_ARROW_COLOR); 

     Drawable [] layers = new Drawable[] { background, leftPanel, rightArrow }; 
     LayerDrawable controlsBackground = new LayerDrawable(layers); 
     controlsBackground.setBounds(0,0,SCREEN_WIDTH,SCREEN_HEIGHT); 
     // set the bounds of each layer 
     for (i=0;i<controlsBackground.getNumberOfLayers();i++) { 
      controlsBackground.getDrawable(i).setBounds(bounds[i]); 
     } 
     controlsBackground.setAlpha(100); 
     controlsLayout.setBackgroundDrawable(controlsBackground); 

     controlsLayout.setVisibility(View.VISIBLE); 
    } 

}

L'activité est appelée ControlsOverlayActivity.java et ressemble à:

public class ControlsOverlayActivity extends Activity { 

    private ControlsOverlayView overlay; 
    private static WattpadApp appState; 


    @Override 
    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.controls_overlay); 

     // initialize the controls overlay 
     ControlsOverlayView.controlsLayout = (LinearLayout) findViewById(R.id.controls_layout); 
     ControlsOverlayView.controlsLayout.setOnClickListener(controlsListener); 
     ControlsOverlayView.controlsTextViews = new TextView[] { 
       (TextView) findViewById(R.id.controls_text_left_above), 
       (TextView) findViewById(R.id.controls_text_right_above), 
       (TextView) findViewById(R.id.controls_text_middle), 
       (TextView) findViewById(R.id.controls_text_left_below), 
       (TextView) findViewById(R.id.controls_text_right_below) 
     }; 
     // initialize the fade in/out animations for the controls overlay 
     ControlsOverlayView.controlsFadeIn = new AlphaAnimation(0,1); 
     ControlsOverlayView.controlsFadeIn.setDuration(ControlsOverlayView.CONTROLS_FADE_DURATION); 
     ControlsOverlayView.controlsFadeOut = new AlphaAnimation(1,0); 
     ControlsOverlayView.controlsFadeOut.setDuration(ControlsOverlayView.CONTROLS_FADE_DURATION); 
     ControlsOverlayView.controlsFadeOut.setAnimationListener(new AnimationListener(){ 
      public void onAnimationEnd(Animation animation) { 
       //ControlsOverlayView.controlsLayout.setVisibility(View.GONE); 
      } 
      public void onAnimationRepeat(Animation animation) {} 
      public void onAnimationStart(Animation animation) {} 
     }); 
    } 

    private OnClickListener controlsListener = new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      finish(); 
     } 
    }; 

} 

Et le fichier xml est appelé controls_overlay.xml et ressemble à:

<?xml version="1.0" encoding="utf-8"?> 
<!-- Controls Overlay --> 
<FrameLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/controls_overlay" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <wp.wattpad.ui.ControlsOverlayView 
       android:layout_width="1dp" 
       android:layout_height="1dp" 
      /> 
    <LinearLayout 
      android:id="@+id/controls_layout" 
      android:orientation="horizontal" 
      android:visibility="invisible" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" > 

      <!-- Left Panel --> 
      <LinearLayout 
       android:orientation="vertical" 
       android:gravity="left" 
       android:layout_width="wrap_content" 
       android:layout_height="fill_parent" > 
       <TextView android:id="@+id/controls_text_left_above" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:gravity="center_horizontal|bottom" 
        android:text="@string/controls_prevpage" /> 
       <TextView android:id="@+id/controls_text_left_below" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:gravity="center_horizontal|top" 
        android:text="@string/controls_scrollslower" /> 
      </LinearLayout> 
      <!-- Middle Panel --> 
      <LinearLayout 
       android:orientation="vertical" 
       android:layout_width="wrap_content" 
       android:layout_height="fill_parent" > 
       <TextView android:id="@+id/controls_text_middle" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:gravity="center_horizontal|center_vertical" 
        android:text="@string/taptoscroll" /> 
      </LinearLayout> 
      <!-- Right Panel --> 
      <LinearLayout 
       android:orientation="vertical" 
       android:gravity="right" 
       android:layout_width="wrap_content" 
       android:layout_height="fill_parent" > 
       <TextView android:id="@+id/controls_text_right_above" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:gravity="center_horizontal|bottom" 
        android:text="@string/controls_nextpage" /> 
       <TextView android:id="@+id/controls_text_right_below" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:gravity="center_horizontal|top" 
        android:text="@string/controls_scrollfaster" /> 
      </LinearLayout> 
     </LinearLayout> 

Je suis vraiment coincé ici et je me demande si l'appel de redimensionnement et de peinture de la méthode onDraw() n'est pas le meilleur endroit pour le faire, mais je ne suis pas sûr d'où je pourrais le faire puisque j'ai besoin de connaître la hauteur et largeur de l'écran. J'ai également essayé de déplacer l'appel à super.onDraw() qui n'a rien changé.

Répondre

2

J'ai trouvé la réponse après plusieurs heures frustrantes. J'appelais resize() avec resize(canvas.getWidth(), canvas.getHeight()); et il aurait dû être controlsLayout.getWidth() et controlsLayout.getHeight(). Même si la hauteur de la toile dépassait de quelques pixels la hauteur de la vue, elle ignorait complètement les limites. Aucune idée pourquoi c'est le cas et il est très frustrant, mais le problème a été résolu.

Questions connexes