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é.