How to implement an android:background that doesn't stretch?

前端 未结 11 1095
太阳男子
太阳男子 2020-11-28 02:51

I found this great thread describing how to \"eat the cake and have it too\", i.e. use image for a Button instead of ImageButton (which doesn\'t al

相关标签:
11条回答
  • 2020-11-28 03:28

    Here's a version of Santosh's answer for programmatically-created buttons, without the need for a separate XML configuration:

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

    I included the ColorFilter line since that works a little differently from buttons with a normal background image.

    0 讨论(0)
  • 2020-11-28 03:29

    The key is to set the drawable as the image of the button, not as a background. Like this:

    rb.setButtonDrawable(R.drawable.whatever_drawable);
    
    0 讨论(0)
  • 2020-11-28 03:31

    I had the same problem: you should only use a 9-patch image (.9.png) instead of your original picture.

    Serge

    0 讨论(0)
  • 2020-11-28 03:33

    You should use ImageView if you don't want it to stretch. Background images will always stretch to fit the view. You need to set it as a Drawable to force the image aspect to the object.

    Otherwise, if you are sticking with the Button idea, then you will need to force the scaling in the button to prevent the image from stretching.

    Code:

    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);
    }
    
    0 讨论(0)
  • 2020-11-28 03:35

    I had a background image, not big in size, but with weird dimensions - therefore the stretching and bad performance. I made a method with parameters Context, a View and a drawable ID(int) that will match the device screen size. Use this in e.g a Fragments onCreateView to set the background.

    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);
    }
    
    0 讨论(0)
  • 2020-11-28 03:40

    You can use a FrameLayout with an ImageView as the first child, then your normal layout as the second child:

    <?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 讨论(0)
提交回复
热议问题