2012-02-21 8 views
4

私は、EditTextImageViewを正しくに整列させる方法を見つけようとしています。私はこの結果を得続ける:ImageViewを水平方向に調整する

enter image description here

XML部分は非常に簡単です:

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 

    <ImageView 
     android:id="@+id/image" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:gravity="center" 
     android:scaleType="centerInside" 
     android:src="@drawable/android" 
     android:visibility="gone" /> 

    <EditText 
     android:id="@+id/edittext" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:singleLine="true" /> 

</LinearLayout> 

私もPravinCGの(alignTop/alignBottomとRelativeLayout)を含め、以下の提案の多くを試みました。

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center_vertical" 
    android:orientation="horizontal" > 

    <ImageView 
     android:id="@+id/image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/edittext" 
     android:layout_alignTop="@+id/edittext" 
     android:scaleType="centerInside" 
     android:src="@drawable/android" 
     android:visibility="visible" /> 

    <EditText 
     android:id="@+id/edittext" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@id/image" 
     android:hint="@string/username" 
     android:singleLine="true" /> 

</RelativeLayout> 

しかし、結果はまったく同じです。

EditTextの背景埋め込み、内在する高さで再生しようとしましたが、役に立たないです。

EditTextの背景ドローラブルは、Androidのバージョン/ ROMによって異なり、すべてサポートしたいと思います。

どのように私はこのアライメントを作ることができますピクセル完璧任意のアンドロイドバージョン(およびスタイル)で?

+0

をあなたはレイアウトを割り当てる必要がありますレイアウトの重さを割り当てることで、任意の風景やポートレートモードで完璧に見えるでしょう。ちょうどそれが動作するかもしれないそれを試してみてください。 – Aamirkhan

+0

パディングで再生すると、異なる解像度で予期しない結果が発生する可能性があります。 –

答えて

8

最後に、さまざまなAndroidバージョン/ ROM /スタイルに対応する適切なソリューションが見つかりました。

主な問題はのEditTextの背景には、それ自体が透明のパディングを持って描画可能なことである。また、 enter image description here

、私はこの透明パディングが異なるAndroidのバージョン/ ROMの/スタイル(株式ICS間たくさんが変わる気づきました、たとえば、透明なパディングはまったくありません)。

私のオリジナルコードは、私のImageViewと私のEditTextを適切に整列させています。しかし、私が本当に欲しいのは、ImageViewをのEditTextの背景の一部に合わせることです。

これを達成するために、EditTextのバックグラウンド描画可能なビットマップから作成したビットマップをスキャンします。私はそれをトップボトムとボトムアップでスキャンして、完全に透明な線の量を見つけ出し、それらの値をImageViewの上/下のパディングとして使用します。このすべては一貫して私のN1で5ミリ秒未満です。コードは次のとおりです。

if(editor.getBackground() != null) { 
    int width = editor.getWidth(); 
    int height = editor.getHeight(); 
    Drawable backgroundDrawable = editor.getBackground().getCurrent(); 

    // Paint the editor's background in our bitmap 
    Bitmap tempBitmap = Bitmap.createBitmap(width, height, Config.ARGB_4444); 
    backgroundDrawable.draw(new Canvas(tempBitmap)); 

    // Get the amount of transparent lines at the top and bottom of the bitmap to use as padding 
    int topPadding = countTransparentHorizontalLines(0, height, tempBitmap); 
    int bottomPadding = countTransparentHorizontalLines(height-1, -1, tempBitmap); 

    // Discard the calculated padding if it means hiding the image 
    if(topPadding + bottomPadding > height) { 
     topPadding = 0; 
     bottomPadding = 0; 
    } 

    tempBitmap.recycle(); 

    // Apply the padding 
    image.setPadding(0, topPadding, 0, bottomPadding); 
} 

private int countTransparentHorizontalLines(int fromHeight, int toHeight, Bitmap bitmap) { 
    int transparentHorizontalLines = 0; 
    int width = bitmap.getWidth(); 
    int currentPixels[] = new int[width]; 
    boolean fullyTransparentLine = true; 

    boolean heightRising = (fromHeight < toHeight); 
    int inc = heightRising ? 1 : -1; 

    for(int height = fromHeight; heightRising ? (height < toHeight) : (toHeight < height); height+=inc) { 
     bitmap.getPixels(currentPixels, 0, width, 0, height, width, 1); 

     for(int currentPixel : currentPixels) { 
      if(currentPixel != Color.TRANSPARENT && Color.alpha(currentPixel) != 255) { 
       fullyTransparentLine = false; 
       break; 
      } 
     } 

     if(fullyTransparentLine) 
      transparentHorizontalLines++; 
     else 
      break; 
    } 

    return transparentHorizontalLines; 
} 

これは魅力的です。

it works!

+0

これは良いことを見るためには良いですが、それは毎回実行時にeditText xmlなどで他のゾルを見つけましたか? – PiyushMishra

+0

残念ながら、1つではありません。私の答えを注意深く読んでください。なぜこれが単純なXMLを使ってできないのか分かります。 – goncalossilva

+1

私たちが簡単に行うことができるのは、編集テキストボックスの画像、テキストボックスのデフォルト画像、probを作成したとき、私はur questとur ansを参照してください...あなたはすばらしい仕事をしました。しかし、私はたくさんのデータを持っていますが、テキストボックスの背景としてur自身のイメージを使用することをお勧めします。ビットマップを編集すると、実行時にたくさんのメモリを取ることができます。 – PiyushMishra

0

android:layout_centerInParent = trueを編集テキストに使用し、天気予報ですか?

+1

残念ながら、いいえ。また、 'android:layout_centerInParent'はLinearLayoutsには影響しません。 – goncalossilva

+0

そのLinearLayoutので、 'android:layout_centerInParent'は動作しません。 – Dharmendra

+0

何かがうまくいかないときは..useトリック:) edittextのみのためにmarginTopを設定してください.. –

1

RelativeLayoutにはandroid:align_bottomandroid:align_Topという属性が必要です。私はコードを書いていません。

+0

あなたはする必要はありません:)とにかく、それは動作しません。私はそれらをRelativeLayoutの中にラップし、 'android:layout_alignTop'と' android:layout_alignBottom'をImageViewに追加しました。上記のスクリーンショットと同じ結果です。 – goncalossilva

+0

貼り付けできますか、どのように実装しましたか? – PravinCG

+0

新しいコードで私の質問を編集しました。ありがとう! – goncalossilva

0

editTextとImageViewのプロパティandroid:gravity = "center"を削除し、linearlayoutのgravityプロパティをcenter_verticallyに設定します。

+0

それを試しましたが、私は同じ結果を得ます。ありがとう! – goncalossilva

1

EditTextsetCompoundDrawables()メソッドを試しましたか?

DrawableのsetBounds()メソッドを使用するか、setCompoundDrawablesWithInstrinsicBounds()メソッドを使用して、組み込み境界を設定できます。

これはすべてのデバイスで有効です。

+0

私はそれを試み、結果を報告します。ありがとう! – goncalossilva

+0

私はそれを試して、それは素晴らしい効果を達成します。しかし、これは実際に私が達成しようとしているものではありません。 'setCompoundDrawables()'を使うと、画像*をEditTextの中に置きます。とにかくありがとう、+1の代替アプローチ! – goncalossilva

+0

ああ... OK。適切な解決策が見つからない場合は、イメージが含まれているかEditTextがそれを避けるためにパディングされているか、または、「Drawable」がcompoundDrawableであり、別のバックグラウンドドロアブルとして、 'EditText'の背景を設定しようとすることができます描画可能領域を割り引く –

1

のEditTextにパディングを取り除くために、単なる背景として、カスタムイメージを使用して...いくつかの影を持つ長方形は十分です...またはあなたが好きな...とに背景を割り当てますEditTextは

android:background="@drawable/myBackground" 
0

を使用して、私は単純に、単にのEditTextに以下を追加することにより、2DPダウンのEditTextを移動することで迅速な回避策を使用:

android:layout_marginBottom="-2dp" 
android:layout_marginTop="2dp" 
+0

この回避策は、ターゲットデバイスの数が少ない場合にのみ機能します。 2dpはAce 2よりもNote 3ではるかに多い。 – ArturoNaredo

関連する問題