web-dev-qa-db-ja.com

ビューを中心からオフセットする方法はありますか?

私はボタンを正確に中央に配置しないようにしていますが、画面の高さの2/5で、属性の検索に失敗したとしましょう。このアプローチを試しました。

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@drawable/background"
Android:padding="20dp" >

 <ImageButton
    Android:id="@+id/flashlight_button"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerHorizontal="true"
    Android:layout_above="@+id/fakeView"
    Android:background="@null"
    Android:contentDescription="@string/flashlight_button_description"
    Android:src="@drawable/freeml_bright" />

   <View
    Android:id="@+id/fakeView"
    Android:layout_width="10dp"
    Android:layout_height="10dp"
    Android:layout_centerInParent="true"
    Android:background="#FFAABB" />

</RelativeLayout>

ただし、偽のビューにマージンを設定しても機能しません。

パディング属性は機能しますが、大きな画像であり、画面の高さの2/5から開始したい場合は、画面の中心点をカバーします。したがって、パディング属性を使用すると、機能しますが、中心から押し出され、それをカバーすることはできません。

けれども、私はLinearLayoutを使用してそれを動作させました。これは、上下に隣接するビューが多く、線形レイアウトを使用してネストされたビューにつながるため、避けたいものでした。残念ながら、それが唯一の選択肢だと思います。

基本的には、上面ビューと底面ビューで未使用のままになっている残りのスペースをheight=0dpweight=1で埋め、その重力を中央に設定する別の線形レイアウトを使用します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:padding="20dp">

<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:orientation="horizontal"
    Android:gravity="center" >

    <ImageView
        Android:id="@+id/imageView1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:contentDescription="@string/application_logo_description"
        Android:src="@drawable/mylight" />

     <ImageButton
        Android:id="@+id/settings_button"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="right"
        Android:background="@null"
        Android:contentDescription="@string/settings_button_description"
        Android:src="@drawable/settings_button" /> 
</LinearLayout>

<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="0dp"
    Android:layout_weight="1"
    Android:gravity="center"
    Android:orientation="vertical" >

    <ImageButton
        Android:id="@+id/flashlight_button"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:background="@null"
        Android:contentDescription="@string/flashlight_button_description"
        Android:src="@drawable/flashlight_button_selector" />

    <View
        Android:id="@+id/fakeView"
        Android:layout_width="0dp"
        Android:layout_height="0dp"
        Android:layout_marginTop="60dp"
        Android:background="#FFAABB" />
</LinearLayout>

<ImageView
    Android:id="@+id/imageView2"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_gravity="bottom|center_horizontal"
    Android:contentDescription="@string/powered_by_description"
    Android:src="@drawable/powered_by" />

<ImageButton
    Android:id="@+id/ad_button"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_gravity="bottom|center_horizontal"
    Android:background="@null"
    Android:contentDescription="@string/ad_button_description"
    Android:src="@drawable/freeml" />

 </LinearLayout>
24
urSus

ターゲットデバイスの画面サイズによっては、X dpによるパディングにより、高さの5分の1以上移動する場合があります。

この動きを自分でコーディングする必要があるかもしれません。ただし、次のことを妨げるものは何もありません。

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
 xmlns:tools="http://schemas.Android.com/tools"
 Android:layout_width="match_parent"
 Android:layout_height="match_parent"
 Android:background="@drawable/background"
 Android:padding="20dp" >

<View
Android:id="@+id/fakeView"
Android:layout_width="10dp"
Android:layout_height="10dp"
Android:layout_centerInParent="true"
Android:background="#FFAABB" />

<ImageButton
Android:id="@+id/flashlight_button"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerHorizontal="true"
Android:layout_above="@+id/fakeView"
Android:marginBottom="50dp"
Android:background="@null"
Android:contentDescription="@string/flashlight_button_description"
Android:src="@drawable/freeml_bright" />


</RelativeLayout>
32
Shark

次のように、マージンを使用せず、パディング(上)を使用します。

<View
Android:id="@+id/fakeView"
Android:layout_width="10dp"
Android:layout_height="10dp"
Android:layout_centerInParent="true"
Android:paddingTop="80dp"
Android:background="#FFAABB" />

私はそれをテストしていませんが、それはうまくいくはずです!

6
Todd Davies

属性Android:layout_toLeftOf = "@ + id/fakeView"を使用してみてください

3
odupont