2012-06-20 16 views
7

मेरे पास एक ऐप है जो स्क्रीन आकार से मेल खाने वाली छवियों के साथ होम स्क्रीन पर वॉलपेपर लागू करता है, हालांकि गैलेक्सी एस 3 वॉलपेपर पर लागू होने पर ज़ूम किया जाता है, भले ही छवि का उपयोग स्क्रीन आयामों से बिल्कुल मेल खाता था! यह एक स्थिर छवि है और जब आप होम स्क्रीन पर पृष्ठों के बीच स्विच करते हैं तब भी स्क्रॉल नहीं करते हैं। अजीब चीज यह है कि अगर मैं निर्मित गैलरी का उपयोग कर छवि को लागू करता हूं तो वॉलपेपर ज़ूम के बिना ठीक लगाया जाता है (यह 'फसल छवि' स्क्रीन के साथ आता है लेकिन फसल क्षेत्र स्वयं छवि के किनारों से मेल खाता है)वॉलपेपर मैनेजर छवि को ज़ूम करता है भले ही आयाम स्क्रीन से मेल खाता है

मैं जिस कोड का उपयोग करता हूं वह फोन की एक पूरी श्रृंखला (गैलेक्सी नोट, एसी 2, एस 2 दूसरों के बीच) पर ठीक काम करता है लेकिन एस 3 पर नहीं; मैं सोच रहा था कि स्क्रीन को भरने के लिए वॉलपेपर को मजबूर करने के लिए मैं कुछ भी कर सकता हूं? वर्तमान कोड मैं वॉलपेपर लागू करने के लिए उपयोग करते हैं:

WallpaperManager wallpaperManager = WallpaperManager.getInstance(this); 
wallpaperManager.setWallpaperOffsets(wallpaperViewer.getApplicationWindowToken(), 0, 0); 
wallpaperManager.setBitmap(BitmapFactory.decodeFile(file.getPath()));//file is jpg on sd card 

उत्तर

9

संपादित: जोड़ा गया Y ऑफसेट ठीक - धन्यवाद @Jason गौफ!

ठीक है तो यह पता चला है कि एस 3 पर होम स्क्रीन की न्यूनतम चौड़ाई 720 नहीं है लेकिन वास्तव में 1280 है! आप तो आदेश स्क्रीन के केंद्र में वॉलपेपर लागू करने के लिए मैं तुरंत एक खाली बिटमैप 1280x1280 बनाने के लिए किया था

wallpaperManager.getDesiredMinimumWidth();//returned 1280 on s3 
wallpaperManager.getDesiredMinimumHeight();//also returned 1280 on s3 

फोन करके वांछित न्यूनतम चौड़ाई और वॉलपेपर की ऊंचाई पता कर सकते हैं, तो मेरी वॉलपेपर ओवरले मेरी BitmapHelper का उपयोग कर

public class BitmapHelper { 

public static Bitmap overlayIntoCentre(Bitmap bmp1, Bitmap bmp2) { 
    Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig()); 
    Canvas canvas = new Canvas(bmOverlay); 
    canvas.drawBitmap(bmp1, new Matrix(), null);//draw background bitmap 

    //overlay the second in the centre of the first 
    //(may experience issues if the first bitmap is smaller than the second, but then why would you want to overlay a bigger one over a smaller one?!) 
    //EDIT: added Y offest fix - thanks @Jason Goff! 
    canvas.drawBitmap(bmp2, (bmp1.getWidth()/2)-(bmp2.getWidth()/2), (bmp1.getHeight()/2)-(bmp2.getHeight/2), null); 

    return bmOverlay; 
} 

public static Bitmap createNewBitmap(int width, int height) 
{ 
      //create a blanks bitmap of the desired width/height 
    return Bitmap.createBitmap(width, height, Config.ARGB_8888); 
} 
} 

और heres मेरी कोड के बाकी: खाली बिटमैप के केन्द्र में, मैं बिटमैप्स में सुधार करने के लिए तरीकों के साथ एक स्थिर BitmapHelper श्रेणी का निर्माण, यहाँ बिटमैप बनाने और वॉलपेपर छवि डालने के लिए तरीके है :

private void applyWallpaperFromFile(final File file) 
{ 
    Bitmap wallpaperImage = BitmapFactory.decodeFile(file.getPath()); 
    try { 
     if((wallpaperManager.getDesiredMinimumWidth()>0)&&(wallpaperManager.getDesiredMinimumHeight()>0)) 
     { 
      Bitmap blank = BitmapHelper.createNewBitmap(wallpaperManager.getDesiredMinimumWidth(), wallpaperManager.getDesiredMinimumHeight()); 
      Bitmap overlay = BitmapHelper.overlayIntoCentre(blank, wallpaperImage); 

      wallpaperManager.setBitmap(overlay); 

     } 
     else 
     { 
      wallpaperManager.setBitmap(wallpaperImage); 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    this.runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      Toast.makeText(WallpaperActivity.this,"Wallpaper set to:"+file.getName(), Toast.LENGTH_SHORT).show(); 

     } 
    }); 

} 
+0

आह कैसे इतने सारे घंटे से छवि का आकार तय करने के लिए की मेरी समस्या हल ... – boltsfrombluesky

+1

धन्यवाद एक टन @AndroidNoob - थोड़ी देर के सटीक वॉलपेपर सेट करने के लिए संघर्ष कर रहा था - अंत में इसके साथ मिल गया आपके कोड में मामूली बदलाव। मूल रूप से एक वाई ऑफसेट सेट करना पड़ा। – KurtCobain

+0

आप मेरे जीवनकाल बचा रहे हैं! मैं इस पर आधा दिन फंस गया हूं। बहुत बहुत धन्यवाद :) – Ralphilius

-1

आप suggestDesiredDimensions उपयोग करके देख सकते() विधि

+2

प्रति http://developer.android.com/reference/android/app/WallpaperManager.html#suggestDesiredDimensions%28int,%20int%29, वह विधि केवल लॉन्चर ऐप्स द्वारा उपयोग की जाने वाली है। – gdw2

2

आप इस पर एक नज़र फिर से करना चाहते हैं हो सकता है: http://developer.android.com/reference/android/app/WallpaperManager.html#suggestDesiredDimensions(int, int)

डेवलपर संदर्भ से: (int minimumWidth

सार्वजनिक शून्य suggestDesiredDimensions, int न्यूनतम हाइट)

चूंकि: एपीआई स्तर 5 केवल वर्तमान घर एप्लिकेशन द्वारा उपयोग के लिए,पर उपयोग के लिएवॉलपेपर का आकार निर्दिष्ट करें जिसका उपयोग करना चाहते हैं। यह अनुप्रयोगों को वर्चुअल वॉलपेपर रखने की अनुमति देता है जो भौतिक स्क्रीन से बड़ा है, जो उनके कार्यक्षेत्र के आकार से मेल खाता है।

नोट डेवलपर्स, जो इसे पढ़ नहीं रहे हैं। यह घर स्क्रीन के लिए है कि वे कौन सा आकार वॉलपेपर चाहते हैं यह बताने के लिए। कोई और नहीं इसे कॉल करना चाहिए! निश्चित रूप से अन्य गैर-होम-स्क्रीन ऐप्स नहीं हैं जो वॉलपेपर बदलते हैं। उन ऐप्स को सुझाए गए आकार को पुनर्प्राप्त करना होगा ताकि वे एक वॉलपेपर बना सकें जो उससे मेल खाता हो।

3

लेख के लिए धन्यवाद। मैंने पाया कि मेरे वॉलपेपर मेरी डिवाइस स्क्रीन के शीर्ष पर जाम कर रहे थे, इसलिए मैंने ओवरलेइन्टोन्टेंट विधि को थोड़ा बदल दिया, दूसरे drawBitmap में 0 को प्रतिस्थापित करने के लिए नीचे ऊंचाई गणना के लिए कॉल किया।

public static Bitmap overlayIntoCentre(Bitmap bmp1, Bitmap bmp2) { 
    Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig()); 
    Canvas canvas = new Canvas(bmOverlay); 
    canvas.drawBitmap(bmp1, new Matrix(), null);//draw background bitmap 

    //overlay the second in the centre of the first 
    //(may experience issues if the first bitmap is smaller than the second, but then why would you want to overlay a bigger one over a smaller one?!) 
    canvas.drawBitmap(bmp2, (bmp1.getWidth()/2)-(bmp2.getWidth()/2), (bmp1.getHeight()/2)-(bmp2.getHeight/2), null); 

return bmOverlay; 

}

+0

अच्छी जगह! मेरा कोड यह मान रहा था कि ओवरलेइंग बिटमैप की ऊंचाई डिवाइस के लिए सही थी और इसलिए लंबवत – AndroidNoob

+0

@ जेसन गोफ - हां - क्या गलत था यह पता लगाकर बिल्कुल वही काम किया - फिर भी अपनी टिप्पणी की जांच की। वाई-ऑफसेट फिक्स के बाद अच्छी तरह से काम करता है। – KurtCobain

संबंधित मुद्दे