Où mettre les limites d'un drawable dans un affichage personnalisé

Présentation: je suis en train de créer des formes simples (carrés et triangles) et puis les utiliser comme image d'arrière-plan pour l'activité. Les tailles des formes dépend de la largeur et de la hauteur de l'écran. Le problème est que, même si je suis à la délimitation de ces formes, ils sont tous attirés aussi grand que possible tout en continuant à montage à l'intérieur de l'écran.

Détails: je suis en train de créer un très simple image d'arrière-plan avec un couple de formes dans un substituée vue de classe appelé ControlsOverlayView.java. Je suis à essayer de comprendre ce que la taille de la toile et puis l'appel de ma méthode de peinture dans la méthode onDraw, parce que c'est quand j'ai d'abord savoir de quelle taille est la toile est. J'ai vérifié en parcourant le code que chaque forme a les bornes correctes, mais le problème est qu'aucune de ces formes sont obéir à leurs limites, et chaque forme de dessin est aussi grand qu'il peut éventuellement aller à l'écran.

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 demandais si peut-être l'appel de redimensionner et de la peinture à partir de la onDraw() la méthode n'est pas le meilleur endroit pour le faire, mais je ne suis pas sûr où je pourrais le faire car j'ai besoin de connaître la hauteur et la largeur de l'écran. J'ai aussi essayé en mouvement autour de l'appel à super.onDraw() qui n'a rien changé.

InformationsquelleAutor odiggity | 2011-07-19