एंड्रॉइड कैसे कार्यान्वित करें: पृष्ठभूमि जो खिंचाव नहीं करती है?


100

मैंने इस महान सूत्र का वर्णन करते हुए पाया कि "केक कैसे खाएं और यह भी है", अर्थात Buttonइसके बजाय छवि का उपयोग करें ImageButton(जो अनुमति नहीं देता है SetText(), आकार बदलना, आदि)।

यह दृश्य विशेषता का उपयोग करके प्राप्त किया जाता है:

android:background="@drawable/bgimage"

इसके साथ एकमात्र समस्या यह है कि यह बटन के आकार को फिट करने के लिए छवि को फैलाता है।

हार्ड-कोडिंग का एक निश्चित बटन आकार (पिक्सल में!), क्या एंड्रॉइड को पृष्ठभूमि की छवि को बिल्कुल भी नहीं खींचने और इसे फसल या पैड करने का एक तरीका है?

जवाबों:


29

यदि आप नहीं चाहते कि आप इसे खींच लें तो आपको ImageView का उपयोग करना चाहिए । दृश्य को फिट करने के लिए पृष्ठभूमि छवियां हमेशा खिंचाव करेंगी। आपको ऑब्जेक्ट के लिए छवि पहलू को मजबूर करने के लिए इसे एक खींचने योग्य के रूप में सेट करने की आवश्यकता है।

अन्यथा, यदि आप बटन विचार के साथ चिपके हुए हैं, तो आपको छवि को खींचने से रोकने के लिए बटन में स्केलिंग को मजबूर करने की आवश्यकता होगी।

कोड:

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
धन्यवाद + 1. ImageViewदिलचस्प लग रहा है। मैंने देखा कि यह एक विशेषता है जो में नहीं है है Button: android:cropToPadding। मुझे इसके बजाय ImageView का उपयोग करने में कोई आपत्ति नहीं है, जब तक कि यह है setOnClickListener()- जो यह करता है। मैं स्विच करके खोने क्या होगा Buttonकरने के लिए ImageView?
ef2011

1
BTW, आपके द्वारा सुझाया गया दूसरा समाधान अभी भी छवि को फैलाता है।
ef2011

मैंने निश्चित बटन आकार (पिक्सेल में) का उपयोग करके समाप्त कर दिया है, लेकिन मैं आपके उत्तर को स्वीकार कर रहा हूं क्योंकि 1 सुझाव एक कार्यशील वैकल्पिक समाधान की तरह दिखता है।
ef2011

1
@ ef2011 इमेज व्यू के लिए, इसे बैकग्राउंड इमेज के रूप में सेट न करें, आपको इसे एक के रूप में सेट करना होगा setDrawableResourceऔर फिर सुनिश्चित करें कि setAdjustViewBoundsयह सही है
डॉ.जे.

9
लंगड़ा समाधान के लिए नीचा दिखाया। यहां सही समाधान: stackoverflow.com/a/9362168/145046
Aleks N.

260

आप एक xml बिटमैप बना सकते हैं और इसे दृश्य के लिए पृष्ठभूमि के रूप में उपयोग कर सकते हैं। स्ट्रेचिंग को रोकने के लिए आप android:gravityविशेषता निर्दिष्ट कर सकते हैं ।

उदाहरण के लिए:

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

बहुत सारे विकल्प हैं जिनका उपयोग आप छवि के प्रतिपादन को अनुकूलित करने के लिए कर सकते हैं

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


3
ImageViews का उपयोग करना एक ऐसा समाधान है जो हमेशा संभव विकल्प नहीं होता है - मेरा मानना ​​है कि यह उचित समाधान है :)
JakeP

3
मैं रन टाइम पर बैकग्राउंड सेट कर रहा हूं। क्या रन टाइम पर बिटमैप बनाने का कोई समाधान है?
विवेक कुमार श्रीवास्तव

1
मेरे लिए यह सबसे अच्छा समाधान था, लेकिन "गुरुत्वाकर्षण" विशेषता को हटा दिया गया, जिससे यह अपने डिफ़ॉल्ट मूल्य "भरण" से मेल खाता है। यह स्क्रीन को फिट करने के लिए छवि को आकार बदलने देगा। अधिक जानकारी के लिए @Santosh लिंक का अध्ययन करें। धन्यवाद!
ह्यूगो

12
मैं केवल इस दृष्टिकोण के साथ एक समस्या देखता हूं। यदि ड्रॉएबल स्रोत कंटेनर से पहले से बड़ा है, तो यह कंटेनर को फिट करने के लिए पहलू अनुपात को बनाए रखने के बजाय, इसे आकार देने के बजाय छवि (गुरुत्वाकर्षण के आधार पर) को क्लिप करेगा।
शाश्वत ब्लैक

1
अब थोड़ा दिनांकित प्रतीत होता है। यह केवल बिटमैप्स के लिए काम करता है, और वेक्टर ड्रॉबल्स के लिए काम नहीं करता है।
the_Sympathizer

25

बस समस्या ImageButtonको Buttonठीक करने के बजाय उपयोग करना ।

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

और आप सेट कर सकते हैं

android:background="@null"

यदि आप चाहते हैं तो बटन पृष्ठभूमि को हटाने के लिए।

जल्दी ठीक !! :-)


1
और फिर setImageResource () विधि से छवि सेट करें ... जो मेरे लिए काम करती है।
अर्लोमेडिया

मैं एक बटन में छवि और पृष्ठभूमि रंग दोनों चाहता था ... यह एक आकर्षण की तरह काम करता है
अभिषेक चौहान

यह मेरे लिए और अधिक सटीक रूप से काम करता है (मेरा मतलब है - "लेआउट_सेंटर वेरिकल", उदाहरण के लिए)।
मैक्सिम फ़िरोज़ॉफ़

11

मैं एक RelativeLayout में एक ImageView का उपयोग कर रहा हूं जो मेरे सामान्य लेआउट के साथ ओवरले करता है। कोई कोड की आवश्यकता है। यह छवि को स्क्रीन की पूर्ण ऊंचाई (या आपके द्वारा उपयोग किए गए किसी भी अन्य लेआउट) का आकार देता है और फिर चौड़ाई को फिट करने के लिए चित्र को बाएँ और दाएँ फ़सल देता है। मेरे मामले में, यदि उपयोगकर्ता स्क्रीन को चालू करता है, तो चित्र थोड़ा छोटा हो सकता है। इसलिए मैं match_parent का उपयोग करता हूं, जो छवि को चौड़ाई में खिंचाव बना देगा यदि बहुत छोटा है।

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

यह वास्तव में एक समस्या का बहुत आसान समाधान है जो मौजूद नहीं होना चाहिए
01kos Nikházy

6

मेरे पास एक ही समस्या थी: आपको अपनी मूल तस्वीर के बजाय केवल 9-पैच छवि (.9.png) का उपयोग करना चाहिए।

एक प्रकार का कपड़ा


5

Android9 के SDK टूल में शामिल draw9patch ... का उपयोग करें । आप अपनी छवि के स्ट्रेचेबल क्षेत्रों को परिभाषित कर सकते हैं। महत्वपूर्ण हिस्से विवश हैं और छवि सभी विकृत नहीं दिखती है। Dra9patch पर एक अच्छा डेमो यहाँ है

अपने मौजूदा छप को बदलने के लिए draw9patch का उपयोग करें। new_splash.9.png में बदलने के लिए, new_splash.9.png को ड्रा करने योग्य-hdpi प्रोजेक्ट फ़ोल्डर में खींचें, यह सुनिश्चित करें कि AndroidManifest और styles.xml नीचे दिए अनुसार उचित हो:

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

मेरे पास पृष्ठभूमि की छवि थी, आकार में बड़ी नहीं, लेकिन अजीब आयामों के साथ - इसलिए खिंचाव और खराब प्रदर्शन। मैंने पैरामीटर के साथ एक तरीका बनाया कॉनटेक्स, एक व्यू और एक ड्रॉबल आईडी (इंट) जो डिवाइस स्क्रीन के आकार से मेल खाएगा। उदाहरण के लिए पृष्ठभूमि सेट करने के लिए एक Fragments onCreateView में इसका उपयोग करें।

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

यहाँ अलग-अलग XML कॉन्फ़िगरेशन की आवश्यकता के बिना प्रोग्राम-निर्मित बटनों के लिए संतोष के उत्तर का एक संस्करण दिया गया है:

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

मैंने ColorFilter लाइन को शामिल किया क्योंकि यह एक सामान्य पृष्ठभूमि छवि के साथ बटन से थोड़ा अलग काम करता है।


1

आप पहले बच्चे के रूप में, फिर दूसरे बच्चे के रूप में अपने सामान्य लेआउट के FrameLayoutसाथ उपयोग कर सकते हैं ImageView:

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

बटन की छवि के रूप में ड्रॉबल को सेट करना महत्वपूर्ण है, न कि पृष्ठभूमि के रूप में। ऐशे ही:

rb.setButtonDrawable(R.drawable.whatever_drawable);

यह CompoundButton का एक तरीका है, लेकिन बटन का नहीं।
अर्लोमेडिया

0

एक अपने xml में एक सादे छवि दृश्य का उपयोग कर सकता है और इसे क्लिक करने योग्य बना सकता है (Android: clickable = "true")? आपको केवल src के रूप में एक छवि का उपयोग करना होगा जिसे एक बटन यानी गोल कोनों की तरह आकार दिया गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.