Как установить обои на весь экран устройства в Android

Я использую набор в качестве обоев в своем приложении для Android. Но когда я устанавливаю изображение в качестве обоев, оно в некоторой степени увеличивается на устройстве. Я хочу, когда я устанавливаю изображение в качестве обоев. Это подходит для любого экранного устройства. Я использую DisplayMetrices, но он не работает идеально.

Код-

   public class FullImageActivity extends Activity {

    int position, width, height;
    LinearLayout full;
    Button btn;
    Context context;
    DisplayMetrics metrics;

    public Integer[] mThumbId = {
                R.drawable.kri1, R.drawable.kri2,
                R.drawable.kri3, R.drawable.kri4,
                R.drawable.kri5, R.drawable.kri6,
                R.drawable.kri7, R.drawable.kri8,
                R.drawable.kri9
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.full_image);

        // get intent data
        Intent i = getIntent();

        // Selected image id
        position = i.getExtras().getInt("id");        
        full = (LinearLayout) findViewById(R.id.full);
        btn = (Button)findViewById(R.id.btn);
        changeBackground();
        metrics = this.getResources().getDisplayMetrics();
        width = metrics.widthPixels;
        height = metrics.heightPixels;
        btn.setOnClickListener(new Button.OnClickListener(){
            @Override
            public void onClick(View arg0) {
            WallpaperManager myWallpaperManager = WallpaperManager.getInstance(getApplicationContext());
            try {
                myWallpaperManager.suggestDesiredDimensions(width, height);
                myWallpaperManager.setResource(mThumbId[position]);
            } catch (IOException e) {
                e.printStackTrace();
           }
        }});
        ActivitySwipeDetector activitySwipeDetector = new ActivitySwipeDetector(this);
        full.setOnTouchListener(activitySwipeDetector);
    }

    private void changeBackground(){
        full.setBackgroundResource(mThumbId[position]);
   }

    public class ActivitySwipeDetector implements View.OnTouchListener {

        static final String logTag = "ActivitySwipeDetector";
        static final int MIN_DISTANCE = 100;
        private float downX, upX;
        Activity activity;

        public ActivitySwipeDetector(Activity activity){
            this.activity = activity;
        }

        public void onRightToLeftSwipe(){
            Log.i(logTag, "RightToLeftSwipe!");
            if(position < mThumbId.length - 1){
                position++;
                 changeBackground();
            }
    }

        public void onLeftToRightSwipe(){
            Log.i(logTag, "LeftToRightSwipe!");
            if(position > 0){
                position--;
                changeBackground();
           }
        }

        public boolean onTouch(View v, MotionEvent event) {
            switch(event.getAction()){
                case MotionEvent.ACTION_DOWN: {
                    downX = event.getX();
                    return true;
                }
                case MotionEvent.ACTION_UP: {
                    upX = event.getX();

                    float deltaX = downX - upX;

                    // swipe horizontal?
                    if(Math.abs(deltaX) > MIN_DISTANCE){
                        // left or right
                        if(deltaX < 0) { this.onLeftToRightSwipe(); return true; }
                        if(deltaX > 0) { this.onRightToLeftSwipe(); return true; }
                    }
                    else {
                            Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE);
                            return false; // We don't consume the event
                    }


                    return true;
                }
            }
            return false;
        }
    }
}

Заранее спасибо.


person John R    schedule 20.03.2014    source источник
comment
Используйте изображения разных размеров, чтобы они могли поддерживать все экраны.   -  person krishna    schedule 20.03.2014
comment
Я не хочу использовать изображения разных размеров. Потому что я не хочу, чтобы размер моего приложения был слишком большим.   -  person John R    schedule 20.03.2014
comment
ох... так что вы можете использовать изображение большого размера и использовать код разрешения для разных разрешений, используя показатели отображения...   -  person krishna    schedule 20.03.2014
comment
Я уже пробовал, но это не работает.   -  person John R    schedule 20.03.2014
comment
@krishna смотрите отредактированный пост.   -  person John R    schedule 20.03.2014
comment
вы получаете ошибку в контексте, используйте getapplicationcontext или это вместо контекста...   -  person krishna    schedule 20.03.2014
comment
@krishna неподвижное изображение увеличивается до некоторой степени.   -  person John R    schedule 20.03.2014
comment
какой размер твоего изображения??   -  person krishna    schedule 20.03.2014
comment
в каких разрешениях есть эффект масштабирования??   -  person krishna    schedule 24.03.2014
comment
Можешь выложить фотки как это выглядит?   -  person Joakim Palmkvist    schedule 28.03.2014


Ответы (4)


я использую эту библиотеку в своем приложении
она работает и проста

CropImage

это открытый исходный код, поэтому вы можете редактировать библиотеку по своему усмотрению
получайте удовольствие

person Community    schedule 28.03.2014
comment
Я не хочу обрезать изображение. - person John R; 29.03.2014

Попробуй это-

Bitmap bmap = BitmapFactory.decodeStream(getResources().openRawResource(mThumb[position]));
DisplayMetrics metrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels; 
int width = metrics.widthPixels;
Bitmap yourbitmap = Bitmap.createScaledBitmap(bmap, width, height, true); 
WallpaperManager wallpaperManager = WallpaperManager.getInstance(this); 
try {
  wallpaperManager.setBitmap(yourbitmap);
  } catch (IOException e) {
  e.printStackTrace();
}
person Kanwaljit Singh    schedule 02.04.2014

Я думаю, вам нужен алгоритм масштабирования Image, который поддерживает соотношение сторон изображения. Сохраните лучшее изображение, которое у вас есть, в папке с возможностью рисования, и пусть это Algorithm уменьшит лучшее изображение, чтобы оно соответствовало Height и Width устройства, сохраняя соотношение сторон исходного изображения. .

 Bitmap scaleDownLargeImageWithAspectRatio(Bitmap image)
            {
                int imaheVerticalAspectRatio,imageHorizontalAspectRatio;
                float bestFitScalingFactor=0;
                float percesionValue=(float) 0.2;

                //getAspect Ratio of Image
                int imageHeight=(int) (Math.ceil((double) image.getHeight()/100)*100);
                int imageWidth=(int) (Math.ceil((double) image.getWidth()/100)*100);
                int GCD=BigInteger.valueOf(imageHeight).gcd(BigInteger.valueOf(imageWidth)).intValue();
                imaheVerticalAspectRatio=imageHeight/GCD;
                imageHorizontalAspectRatio=imageWidth/GCD;
                Log.i("scaleDownLargeImageWIthAspectRatio","Image Dimensions(W:H): "+imageWidth+":"+imageHeight);
                Log.i("scaleDownLargeImageWIthAspectRatio","Image AspectRatio(W:H): "+imageHorizontalAspectRatio+":"+imaheVerticalAspectRatio);

                //getContainer Dimensions
                int displayWidth = getWindowManager().getDefaultDisplay().getWidth();
                int displayHeight = getWindowManager().getDefaultDisplay().getHeight();
               //I wanted to show the image to fit the entire device, as a best case. So my ccontainer dimensions were displayWidth & displayHeight. For your case, you will need to fetch container dimensions at run time or you can pass static values to these two parameters 

                int leftMargin = 0;
                int rightMargin = 0;
                int topMargin = 0;
                int bottomMargin = 0;
                int containerWidth = displayWidth - (leftMargin + rightMargin);
                int containerHeight = displayHeight - (topMargin + bottomMargin);
                Log.i("scaleDownLargeImageWIthAspectRatio","Container dimensions(W:H): "+containerWidth+":"+containerHeight);

                //iterate to get bestFitScaleFactor per constraints
                while((imageHorizontalAspectRatio*bestFitScalingFactor <= containerWidth) && 
                        (imaheVerticalAspectRatio*bestFitScalingFactor<= containerHeight))
                {
                    bestFitScalingFactor+=percesionValue;
                }

                //return bestFit bitmap
                int bestFitHeight=(int) (imaheVerticalAspectRatio*bestFitScalingFactor);
                int bestFitWidth=(int) (imageHorizontalAspectRatio*bestFitScalingFactor);
                Log.i("scaleDownLargeImageWIthAspectRatio","bestFitScalingFactor: "+bestFitScalingFactor);
                Log.i("scaleDownLargeImageWIthAspectRatio","bestFitOutPutDimesions(W:H): "+bestFitWidth+":"+bestFitHeight);
                image=Bitmap.createScaledBitmap(image, bestFitWidth,bestFitHeight, true);

                //Position the bitmap centre of the container
                int leftPadding=(containerWidth-image.getWidth())/2;
                int topPadding=(containerHeight-image.getHeight())/2;
                Bitmap backDrop=Bitmap.createBitmap(containerWidth, containerHeight, Bitmap.Config.RGB_565);
                Canvas can = new Canvas(backDrop);
                can.drawBitmap(image, leftPadding, topPadding, null);

                return backDrop;
            }


private void changeBackground()
    {
        Drawable inputDrawable = mThumbId[position];
        Bitmap bitmap = ((BitmapDrawable)inputDrawable).getBitmap();
        bitmap = scaleDownLargeImageWithAspectRatio(bitmap);
        @SuppressWarnings("deprecation")
        Drawable outDrawable=new BitmapDrawable(bitmap);  
        full.setBackground(outDrawable);
    }
person Parth Kapoor    schedule 31.03.2014
comment
Растровое изображение = ((BitmapDrawable)mThumbId[position]).getBitmap(); на этой линии. невозможно преобразовать растровое изображение в целочисленную ошибку. - person John R; 31.03.2014
comment
Я добавил changeBackground() внизу моего ответа. Пожалуйста, проверьте и оставьте отзыв. - person Parth Kapoor; 31.03.2014
comment
Я устанавливаю обои при нажатии кнопки, не думаете ли вы, что мне нужно включить какой-либо код в кнопку onClick. - person John R; 01.04.2014
comment
Дружище, вызови функцию changeBackground() в методе кнопки onClick. - person Parth Kapoor; 07.04.2014

попробуйте этот код, чтобы установить изображение в качестве обоев

    public void setWallpaper(final Bitmap bitmp)
    {
        int  screenWidth=getWallpaperDesiredMinimumWidth();
        int    screenHeight=getWallpaperDesiredMinimumHeight();
                try {

                WallpaperManager    wallpaperManager = WallpaperManager.getInstance(this);


                        Bitmap btm = getResizedBitmap(bitmp, screenHeight, screenWidth);
                        wallpaperManager.setBitmap(btm);
                    Toast toast=Toast.makeText(this, "Done", Toast.LENGTH_SHORT);
                    toast.setGravity(Gravity.TOP|Gravity.CENTER, 0, 0);
                    toast.show();

                } catch (IOException e) {
                    e.printStackTrace();
                }
    }

и

 public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {

            int width = bm.getWidth();

            int height = bm.getHeight();

            float scaleWidth = ((float) newWidth) / width;

            float scaleHeight = ((float) newHeight) / height;

            /**
             *  create a matrix for the manipulation
             */

            Matrix matrix = new Matrix();

            /**
             *  resize the bit map
             */

            matrix.postScale(scaleWidth, scaleHeight);

            /**
             * recreate the new Bitmap
             */

            Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);

            return resizedBitmap;

            }

ИЗМЕНИТЬ:

Вам нужно просто вызвать эту функцию с желаемым растровым изображением

btn.setOnClickListener(new Button.OnClickListener(){
        @Override
        public void onClick(View arg0) {
         setWallpaper(BitmapFactory.decodeResource(FullImageActivity.this.getResources(),
                                       mThumbId[position]));
    }});
person droid_ravikant    schedule 29.03.2014
comment
@JohnR: Если вы действительно не знаете, где использовать приведенный выше код, я думаю, вам действительно нужно изучить основы Android, прежде чем работать над ним. - person Mehul Joisar; 01.04.2014
comment
@MehulJoisar Мне было трудно написать этот код в своем коде. Когда я вызываю метод set setWallpaper(mThumbId[position]) в методе onClick, отображается ошибка преобразования типа массива в растровое изображение. - person John R; 01.04.2014
comment
Размер неподвижного изображения @MehulJoisar больше размера экрана. - person John R; 03.04.2014