2011-07-19 15 views
1

概要:単純なシェイプ(四角形や三角形)を作成し、アクティビティの背景イメージとして使用しようとしています。形状のサイズは、画面の幅と高さに依存します。問題は、これらの図形の境界線を設定しているにもかかわらず、画面内に収まるうちにできるだけ大きく描画されていることです。カスタムビューのドロウアブルの境界を設定する場所

詳細:私は、ControlOverlayView.javaというオーバーライドされたビュークラスの中に、いくつかの図形を含む非常に単純な背景イメージを作成しようとしています。キャンバスの大きさを把握してから、onDrawメソッドでペイントメソッドを呼び出します。これは、キャンバスの大きさを最初に知るときであるためです。私は、それぞれの形状が正しい境界を持っているというコードを踏んで二重チェックをしましたが、問題はその形状に境界線に従っていないということです。 controls_overlay.xmlと呼ばれる

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

} 

とXMLファイルと次のようになります:

<?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> 

活動がControlsOverlayActivity.javaと呼ばれるようになります

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

}

私は本当にここにこだわっていて、onDraw()メソッドからサイズ変更とペイントを呼び出すのが最適な場所ではないのだろうかと疑問に思っています。しかし、高さを知る必要があるので、画面の幅。また、何も変更しなかったsuper.onDraw()の呼び出しを回避しようとしました。

答えて

2

数時間の不満の後に答えが見つかりました。私はresize()resize(canvas.getWidth(), canvas.getHeight());と呼んでいたので、それはcontrolsLayout.getWidth()controlsLayout.getHeight()だったはずです。キャンバス高さの高さはビューの高さから数ピクセル離れていましたが、境界を完全に無視していました。なぜこれが当てはまるのか分かりませんし、それはひどくイライラしますが、問題は解決します。

関連する問題