Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Γειά σας, φτιάχνω ένα προγραμματάκι εδώ και λίγο καιρό και έχω κολλήσει σε ένα σημείο. Καταρχήν ο χρήστης επιλέγει κάποια εικόνα για να μπεί σε wallpaper, το αποθηκεύω σε shared preferences και μετά με αυτόν τον κώδικα εμφανίζω το wallpaper.

>
Display display = getWindowManager().getDefaultDisplay();

SharedPreferences prefs = getBaseContext().getSharedPreferences(PREFS_NAME,0);
if (prefs.contains(d)) {
   Bitmap bitmapOrg = BitmapFactory.decodeFile(prefs.getString(d, ""));
	      int width = bitmapOrg.getWidth();
	      int height = bitmapOrg.getHeight();
	      int newWidth = display.getWidth();
	      int newHeight = display.getHeight();
	      int scaleHeight, scaleWidth;
	      
	     if(height > width)
	      {
	    	  scaleHeight = newHeight;
	    	  scaleWidth = (width*newWidth)/height;
	      }
	      else
	      {
	    	  scaleHeight = (height*newWidth)/width;
	          scaleWidth = width;
	      }

	     Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmapOrg, scaleWidth, scaleHeight, false);
           myWallpaperManager.setBitmap(resizedBitmap);
}

Στην ουσία βλέπω ποιά διάσταση της εικόνας είνια μεγαλύτερη (ύψος ή πλάτος) και αφού αλλάξω την διάσταση της ωστε να χωράει στην οθόνη αλλάζω και το πλάτος με τον ίδιο τρόπο ωστε να παραμείνουν οι αναλογίες ίδιες.

 

Το πρόβλημα είναι οτι ενώ βρίσκει τις σωστές διαστάσεις πχ μετά το scale μπορεί να μου εμφανίσει ύψος=320(όσο η οθόνη) και πλάτος=110 (μικρότερο της οθόνης) οταν βάζει το wallpaper μου εμφανίζει κάτι τέτοιο ενώ εγώ θέλω να μου εμφανίζει κενά οπου είναι μικρότερη η εικόνα. Δηλαδή κάτι τέτοιο.

 

Έχει κανείς καμια ιδέα πως να το κάνω αυτό?

Δημοσ.

Όταν επιθυμώ να παρουσιάσω ένα Bitmap με απόλυτες διαστάσεις δίχως το σύστημα να προβεί αυτόματα σε resize με βάση το DENSITY της οθόνης της συσκευής ορίζω το Bitmap μου ως

>myBitmap.setDensity(Bitmap.DENSITY_NONE);

οπότε το Android προβάλει το Bitmap σεβόμενο οπωσδήποτε τις διαστάσεις που έχω ορίσει εγώ, βέβαια έτσι χάνουμε την αυτόματη συμβατότητα με άλλες αναλύσεις (διαφορετικές συσκευές/οθόνες) αλλά αυτό υπό συνθήκες είναι επιθυμητό.

 

Υ.Γ.

Δεν έχω ασχοληθεί με τα wallpaper του Android οπότε το καταθέτω με κάθε επιφύλαξη για την αποτελεσματικότητα του σε αυτό που επιθυμείς να κάνεις.

Δημοσ.

Μπά δεν δουλεύει, δεν μου αλλάζει κάτι στην εικόνα. Παρόλο που αν εμφανίσω σε πχ σε ενα toast τις scaledHeight, scaleWidth μου βγάζει (480,129) οσο πρέπει να είνια δηλαδή αυτό πάει και ξανακάνει resize την εικόνα για να πιάνει όλο το background.

 

Σκέφτηκα το άλλο, να φτιάξω ένα μεγάλο bitmap μαύρο με τις διαστάσεις της οθόνης και να τοποθετήσω την εικόνα στην μέση.. θα το δοκιμάσω και θα στείλω τα αποτελέσματα.

Ευχαριστώ για την απάντηση πάντως.

Δημοσ. (επεξεργασμένο)

--EDIT:

Σκέφτηκα το άλλο, να φτιάξω ένα μεγάλο bitmap μαύρο με τις διαστάσεις της οθόνης και να τοποθετήσω την εικόνα στην μέση.. θα το δοκιμάσω και θα στείλω τα αποτελέσματα.

Μετά από διάφορα πειράματα (τον κώδικα των οποίων κατέβασα διότι εκβίαζα το Σύστημα / API :D) με το WallpaperManager ίσως καλύτερα να κινηθείς έτσι..

 

--EDIT:

Υ.Γ.

Το αποτέλεσμα από τα πειράματα που έλεγα:

post-41640-0-33878900-1321913210_thumb.png

Επεξ/σία από Directx
Δημοσ.

Καλό αυτό που έκανες. Τί ακριβώς έκανες? Αυτό που σου είπα με το μεγάλο bitmap και μέσα σχεδίασες το τετράγωνο? Πώς ακριβώς το έκανες αυτό?

Δημοσ.

Καλό αυτό που έκανες. Τί ακριβώς έκανες? Αυτό που σου είπα με το μεγάλο bitmap και μέσα σχεδίασες το τετράγωνο? Πώς ακριβώς το έκανες αυτό?

Όχι, εκμεταλλεύτηκα (ενώ δεν έπρεπε καθώς δεν είμαι το Home Application του Συστήματος) το suggestDesiredDimensions function που προσφέρει το WallpaperManager, μαζί με ορισμένα βήματα για να εκβιάσω το WallpaperManager να προβάλει σωστά το Bitmap μου. Το κακό είναι ότι τα βήματα αυτά που εφαρμόζω δεν δουλεύουν πάντα (για αυτό και κατέβασα το αρχικό μου post με τον κώδικα, διότι δεν είναι καλή λύση -αν και σε βάζει σε πειρασμό :-\).

 

Όλα αυτά σε Android 2.2 Image (emulator) δεν το δοκίμασα σε Συσκευή.

Δημοσ.

Δοκίμασα το suggestDesiredDimensions μόνο του και αν και έβαλε την εικόνα κανονικά στην οθόνη μετά όταν πήγα να αλλάξω το φόντο το άλλαζε μόνο στα όρια που είχα ορίσει εγώ να βάλει την εικόνα :P :P

 

Και μετά απο αρκετά πειράματα βρήκα την άκρη :P

Τελικά κατέληξα στο να φτιάξω ένα bitmap με τις διαστάσεις της οθόνης και να ζωγραφίσω στο κέντρο την εικόνα που θέλω. Οπότε έχω αυτό.

 

>if(prefs.contains(d)){
  		Bitmap bitmapOrg = BitmapFactory.decodeFile(prefs.getString(d, ""));
  		Bitmap newBmp ;
  	      
             int width = bitmapOrg.getWidth();
	      int height = bitmapOrg.getHeight();
	      int newWidth = display.getWidth();
	      int newHeight = display.getHeight();
	      int scaleHeight = 0, scaleWidth = 0;
	      newBmp = Bitmap.createBitmap(display.getWidth(), display.getHeight(), Bitmap.Config.ARGB_8888); //φτιάχνω ένα μαύρο bitmap
	      
	     if(height > width)
	      {
	    	  scaleHeight = newHeight-30;
	    	  scaleWidth = (width*scaleHeight)/height;
	      }
	      else
	      {
	    	  scaleHeight = (height*scaleWidth)/width;
	          scaleWidth = newWidth-20;
	      }
             Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmapOrg, scaleWidth, scaleHeight, false);

           Bitmap newB = overlay(newBmp, resizedBitmap,(display.getWidth())/2,resizedBitmap.getWidth());
  	    myWallpaperManager.setBitmap(newB);
  		   
  	}

 

όπου

>private Bitmap overlay(Bitmap bmp1, Bitmap bmp2, int left, int imgsize) {
      Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());
      Canvas canvas = new Canvas(bmOverlay);
      canvas.drawBitmap(bmp1, new Matrix(), null);
      canvas.drawBitmap(bmp2, left-(imgsize/2), 15, null);
      return bmOverlay;
  }

 

και το εμφανίζει μια χαρά και στο κινητό και στο emulator. Το μόνο που μου μένει είναι να το δοκιμάσω και σε άλλες αναλύσεις να δώ μήπως εμφανίζει τίποτα λάθος.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...