Bir android nasıl uygulanır: esnemeyen arka plan?


100

"Pastayı nasıl yiyip ona da sahip olacağınızı" açıklayan bu harika iş parçacığını buldum , yani a Buttonyerine resim kullanın ImageButton(izin vermeyen SetText(), yeniden boyutlandırma, vb.).

Bu, View özniteliği kullanılarak elde edilir:

android:background="@drawable/bgimage"

Bununla ilgili tek sorun, görüntüyü düğme boyutuna sığacak şekilde uzatmasıdır.

Kısa sabit kodlama sabit düğme boyutunu (piksel olarak!), Android anlamanın bir yolu yoktur değil hiç arka plan görüntüsü ve ya kırpma veya yastık da germek için?

Yanıtlar:


29

Uzatılmasını istemiyorsanız ImageView kullanmalısınız . Arka plan resimleri her zaman görünüme sığacak şekilde uzayacaktır. Görüntü boyutunu nesneye zorlamak için onu bir Çekilebilir olarak ayarlamanız gerekir.

Aksi takdirde, Düğme fikrine bağlı kalıyorsanız, görüntünün uzamasını önlemek için düğmedeki ölçeklendirmeyi zorlamanız gerekecektir.

Kod:

onCreate(Bundle bundle) {
  // Set content layout, etc up here

  // Now adjust button sizes
  Button b = (Button) findViewById(R.id.somebutton);
  int someDimension = 50; //50pixels
  b.setWidth(someDimension);
  b.setHeight(someDimension);
}

1
Teşekkürler + 1. ImageViewilginç görünüyor. Bunun içinde değil bir öznitelik vardır fark Button: android:cropToPadding. Bunun yerine, olduğu sürece bir ImageView kullanmayı umursamıyorum setOnClickListener()- ki öyle. Ben geçiş yaparak kaybetme ne olacak Buttonkadar ImageView?
ef2011

1
BTW, önerdiğiniz 2. çözüm hala görüntüyü uzatıyor.
ef2011

Sabit düğme boyutunu (piksel cinsinden!) Kullandım ancak cevabınızı kabul ediyorum çünkü 1. öneri çalışan bir alternatif çözüm gibi görünüyor.
ef2011

1
@ ef2011 ImageView için arka plan görüntüsü olarak ayarlamayın, bunu bir arka plan görüntüsü olarak ayarlamanız setDrawableResourceve ardından setAdjustViewBoundsdoğru olarak ayarlandığından emin olmanız gerekir
Dr.J

9
Kötü bir çözüm için olumsuz oy verildi. Burada doğru çözüm: stackoverflow.com/a/9362168/145046
Aleks N.

261

Bir xml bit eşlemi oluşturabilir ve bunu görünüm için arka plan olarak kullanabilirsiniz. Esnemeyi önlemek için android:gravityniteliği belirtebilirsiniz .

Örneğin:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/dvdr"
    android:tileMode="disabled" android:gravity="top" >
</bitmap>

Görüntünün oluşturulmasını özelleştirmek için kullanabileceğiniz birçok seçenek var.

http://developer.android.com/guide/topics/resources/drawable-resource.html#Bitmap


3
ImageViews kullanmak her zaman olası bir seçenek olmayan bir çözümdür
JakeP

3
Çalışma zamanında arka planı ayarlıyorum. Çalışma zamanında bit eşlem oluşturmak için herhangi bir çözüm var mı?
Vivek Kumar Srivastava

1
benim için bu en iyi çözümdü, ancak "yerçekimi" özniteliğini kaldırarak, varsayılan değeri "dolgu" ile eşleşiyor. Bu, görüntünün ekrana sığması için yeniden boyutlandırılmasına izin verecektir. Daha fazla bilgi için @Santosh bağlantısını inceleyin. Teşekkürler!
Hugo

12
Bu yaklaşımla ilgili yalnızca bir sorun görüyorum. Çekilebilir kaynak zaten kaptan daha büyükse, bu, kabı sığdırmak için görüntü oranını koruyarak yeniden boyutlandırmak yerine görüntüyü (yerçekimine dayalı olarak) kırpacaktır.
Shashwat Black

1
Şimdi biraz tarihli görünüyor. Bu yalnızca bit eşlemler için çalışır ve Vektör çizimleri için çalışmaz.
The_Sympathizer

25

ImageButtonBunun yerine basitçe kullanmak Buttonsorunu çözer.

<ImageButton android:layout_width="30dp"
             android:layout_height="30dp"
             android:src="@drawable/bgimage" />

ve ayarlayabilirsin

android:background="@null"

İsterseniz düğme arka planını kaldırmak için.

Hızlı düzeltme !! :-)


1
Ve sonra benim için çalışan setImageResource () yöntemiyle ... görüntüyü ayarlayın.
arlomedia

bir düğmede hem görüntü hem de arka plan rengini istedim ... bu bir cazibe gibi çalıştı
Abhishek Chauhan

Benim için daha doğru çalışıyor (örneğin - "layout_centerVertical" demek istiyorum).
Maxim Firsoff

12

Normal düzenimle örtüşen bir RelativeLayout'ta bir ImageView kullanıyorum. Kod gerekmez. Görüntüyü ekranın tam yüksekliğine (veya kullandığınız başka bir düzene) boyutlandırır ve ardından genişliğe sığdırmak için resmi sola ve sağa kırpar. Benim durumumda, kullanıcı ekranı çevirirse, resim biraz çok küçük olabilir. Bu nedenle, eğer çok küçükse görüntünün genişliğini uzatacak olan match_parent kullanıyorum.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/main_backgroundImage"
        android:layout_width="match_parent"
        //comment: Stretches picture in the width if too small. Use "wrap_content" does not stretch, but leaves space

        android:layout_height="match_parent"
        //in my case I always want the height filled

        android:layout_alignParentTop="true"
        android:scaleType="centerCrop"
        //will crop picture left and right, so it fits in height and keeps aspect ratio

        android:contentDescription="@string/image"
        android:src="@drawable/your_image" />

    <LinearLayout
        android:id="@+id/main_root"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    </LinearLayout>

</RelativeLayout>

Bu aslında olmaması gereken bir sorun için çok daha kolay bir çözüm
Ákos Nikházy

6

Ben de aynı sorunu yaşadım: Orijinal resminiz yerine yalnızca 9 yama resmi (.9.png) kullanmalısınız.

Serge


5

Android Studio'nun SDK araçlarında bulunan draw9patch ... kullanın . Görüntünüzün gerilebilir alanlarını tanımlayabilirsiniz. Önemli parçalar kısıtlanmıştır ve görüntü tamamen çarpık görünmemektedir. Dra9patch ile ilgili iyi bir demo BURADA

Mevcut splash.png dosyanızı new_splash.9.png olarak değiştirmek için draw9patch kullanın, new_splash.9.png'yi drawable-hdpi proje klasörüne sürükleyin, AndroidManifest ve styles.xml'nin aşağıdaki gibi uygun olduğundan emin olun:

AndroidManifest.xml:

<application
...
        android:theme="@style/splashScreenStyle"
>

styles.xml:

<style name="splashScreenStyle" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowBackground">@drawable/new_splash</item>
</style>

3

Büyük olmayan ama tuhaf boyutlara sahip bir arka plan resmim vardı - dolayısıyla esneme ve kötü performans. Context, View and a drawable ID (int) parametreleriyle cihaz ekran boyutuna uyacak bir yöntem yaptım. Bunu, örneğin arka planı ayarlamak için Fragments onCreateView'da kullanın.

public void setBackground(Context context, View view, int drawableId){
    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),drawableId);

    bitmap = Bitmap.createScaledBitmap(bitmap, Resources.getSystem().
             getDisplayMetrics().widthPixels,
             Resources.getSystem().getDisplayMetrics().heightPixels,
             true);

    BitmapDrawable bitmapDrawable = new BitmapDrawable(context.getResources(), 
                                    bitmap);

    view.setBackground(bitmapDrawable);
}

1

Santosh'un ayrı bir XML yapılandırmasına ihtiyaç duymadan programla oluşturulmuş düğmeler için cevabının bir sürümü:

Button button = new Button(getContext());
Bitmap backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_button);
BitmapDrawable backgroundDrawable = new BitmapDrawable(getResources(), backgroundBitmap);
backgroundDrawable.setGravity(Gravity.CENTER); // also LEFT, CENTER_VERTICAL, etc.
backgroundDrawable.setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SRC_ATOP));
button.setBackground(backgroundDrawable);

Normal bir arka plan resmine sahip düğmelerden biraz farklı çalıştığı için ColorFilter serisini dahil ettim.


1

İlk çocuk olarak a FrameLayoutile birlikte ImageView, ardından ikinci çocuk olarak normal düzeninizi kullanabilirsiniz:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <ImageView
        android:id="@+id/background_image_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@drawable/your_drawable"/>

  <LinearLayout
        android:id="@+id/your_actual_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

  </LinearLayout>

</FrameLayout>

0

Anahtar, çekilebilir öğeyi arka plan olarak değil, düğmenin görüntüsü olarak ayarlamaktır. Bunun gibi:

rb.setButtonDrawable(R.drawable.whatever_drawable);

Bu bir CompoundButton yöntemidir, ancak Button yöntemi değildir.
arlomedia

0

Xml'sinde düz bir ImageView kullanabilir ve onu tıklanabilir hale getirebilir (android: clickable = "true")? Src olarak sadece düğme şeklinde, yani yuvarlak köşeli bir görüntüyü kullanmanız gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.