繁体   English   中英

如何设置图像墙纸的实际尺寸?

[英]How to Set wallpaper of image with its actual size?

我正在做一个项目,其中每5秒更改一次墙纸。 我可以设置墙纸,但是它是通过裁切图像来设置墙纸的。 我想将墙纸设置为实际大小,对此我该怎么办?

BitmapFactory.decodeFile(list.get(i));
                options.inJustDecodeBounds = false;

                if (myBitmap != null) {
                    myBitmap.recycle();
                    myBitmap = null;
                }
                Bitmap decodedSampleBitmap = BitmapFactory.decodeFile(list
                        .get(i));
// here height and width are the height and width of the display screen
                myBitmap = Bitmap.createScaledBitmap(decodedSampleBitmap,
                        width, height, true);
                if (decodedSampleBitmap != myBitmap)
                    decodedSampleBitmap.recycle();
                decodedSampleBitmap = null;

                WallpaperManager wm = WallpaperManager
                        .getInstance(WallService.this);
                try {
                    Log.i("In Service", "before set wallpaper");
                    wm.setBitmap(myBitmap);
                    Log.i("In Service", "after set wallpaper");
                    Thread.sleep(5000);
                    Log.i("In Service", "after thread");

                } catch (Exception e) {
                    Log.e("Exception", "Cannot set image as wallpaper", e);
                }

更新1:

如果我使用此代码,则墙纸将设置为图像的实际大小。 现在我遇到了一个小问题,即当我再次打开应用程序并单击“选择照片”按钮时,照片未显示在自定义画廊中

for (int i = 0; i <= list.size(); i++) {
                if (i == list.size()) {
                    i = 0;
                }

                BitmapFactory.decodeFile(list.get(i));
                options.inJustDecodeBounds = false;

                if (myBitmap != null) {
                    myBitmap.recycle();
                    myBitmap = null;
                }

                if (decodedSampleBitmap != null) {
                    decodedSampleBitmap.recycle();
                    decodedSampleBitmap = null;
                }
                decodedSampleBitmap = BitmapFactory.decodeFile(list
                        .get(i));
                //myBitmap = Bitmap.createScaledBitmap(decodedSampleBitmap, width, height, true);
                /*if (decodedSampleBitmap != myBitmap)
                    decodedSampleBitmap.recycle();
                decodedSampleBitmap = null;
*/
                WallpaperManager wm = WallpaperManager
                        .getInstance(WallService.this);
                try {
                    Log.i("In Service", "before set wallpaper");
                    wm.setBitmap(decodedSampleBitmap);
                    Log.i("In Service", "after set wallpaper");
                    Thread.sleep(5000);
                    Log.i("In Service", "after thread");

                } catch (Exception e) {
                    Log.e("Exception", "Cannot set image as wallpaper", e);
                }
            }

在活动课中...我正在获取日志“单击按钮”,但没有在活动结果中获取日志

@Override
    public void onClick(View view) {
        switch (view.getId()) {
        case R.id.btnAddPhots:
            Intent intent = new Intent(MainActivity.this,
                    CustomPhotoGalleryActivity.class);
            startActivityForResult(intent, PICK_IMAGE_MULTIPLE);
            Log.i("Main Activity", "button clicked");
            break;



@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.i("Main Activity", "in on activity result");
        if (resultCode == RESULT_OK) {
            Log.i("Main Activity", "in if1");
            if (requestCode == PICK_IMAGE_MULTIPLE) {
                Log.i("Main Activity", "in if2");
                imagesPathList = new ArrayList<String>();
                String[] imagesPath = data.getStringExtra("data").split("\\|");
                try {
                    Log.i("Main Activity", "in try");
                    lnrImages.removeAllViews();
                } catch (Throwable e) {
                    Log.i("Main Activity", "in catch");
                    e.printStackTrace();
                }

更新2 ..

我之前尝试过,现在再次尝试过,它只是将图像的背景色设置为墙纸。 如果我使用Update1代码,它将正常工作,但效果不佳

Public class WallService extends Service {

    ArrayList<String> list;
    Bitmap myBitmap;
    int width, height;
    Bitmap decodedSampleBitmap = null;

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        Log.i("on create", "Service Created");

    }

    @Override
    @Deprecated
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);

        list = intent.getStringArrayListExtra("Imagess");
        width = intent.getExtras().getInt("Width");
        height = intent.getExtras().getInt("Height");
        Log.i("Width= ", "" + width);
        Log.i("Height= ", "" + height);
        new LongOperation().execute("");
    }

    private class LongOperation extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {

            int h = 0;
            int w = 0;

            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            for (int i = 0; i <= list.size(); i++) {
                if (i == list.size()) {
                    i = 0;
                }

                BitmapFactory.decodeFile(list.get(i));
                options.inJustDecodeBounds = false;

                if (myBitmap != null) {
                    myBitmap.recycle();
                    myBitmap = null;
                }

                if (decodedSampleBitmap != null) {
                    decodedSampleBitmap.recycle();
                    decodedSampleBitmap = null;
                }
                decodedSampleBitmap = decodeSampledBitmapFromFile(list.get(i),
                        w, h);
                // myBitmap = Bitmap.createScaledBitmap(decodedSampleBitmap,
                // width, height, true);
                /*
                 * if (decodedSampleBitmap != myBitmap)
                 * decodedSampleBitmap.recycle(); decodedSampleBitmap = null;
                 */
                WallpaperManager wm = WallpaperManager
                        .getInstance(WallService.this);
                try {
                    Log.i("In Service", "before set wallpaper");
                    wm.setBitmap(decodedSampleBitmap);
                    Log.i("In Service", "after set wallpaper");
                    Thread.sleep(5000);
                    Log.i("In Service", "after thread");

                } catch (Exception e) {
                    Log.e("Exception", "Cannot set image as wallpaper", e);
                }
            }
            return "Executed";
        }

        public Bitmap decodeSampledBitmapFromFile(String path, int width,
                int height) {
            // TODO Auto-generated method stub
            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(path, options);
            // String imageType = options.outMimeType;

            // Calculate inSampleSize
            options.inSampleSize = calculateInSampleSize(options, width, height);

            // Decode bitmap with inSampleSize set
            options.inJustDecodeBounds = false;

            return BitmapFactory.decodeFile(path, options);
        }

        @Override
        protected void onPostExecute(String result) {

        }

        @Override
        protected void onPreExecute() {
        }

        @Override
        protected void onProgressUpdate(Void... values) {
        }
    }

    public int calculateInSampleSize(BitmapFactory.Options options,
            int reqWidth, int reqHeight) {
        // TODO Auto-generated method stub
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            // Calculate ratios of height and width to requested height and
            // width
            final int heightRatio = Math.round((float) height
                    / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);

            // Choose the smallest ratio as inSampleSize value, this will
            // guarantee
            // a final image with both dimensions larger than or equal to the
            // requested height and width.
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }
        // Log.d(MainActivity.TAG, " in sample Size: " + inSampleSize);
        return inSampleSize;
    }

}

前段时间我已经回答了一个类似的问题: 如何在android中永久设置墙纸

我创建了一个简单的应用程序随意改变壁纸太,完整文件的代码是在这里也许是你想要的(这里的两个关键功能是decodeSampledBitmapFromFilecalculateInSampleSize

private void changeWallPaper(int h, int w){
    String path = getRandomFile();
    Bitmap bm = decodeSampledBitmapFromFile(path, w, h);

    try {
        WallpaperManager mywall = WallpaperManager.getInstance(this);
        Log.i(MainActivity.TAG, "Setting wallpaper to " + path);
        mywall.setBitmap(bm);
    } catch (IOException e) {
        Log.e(MainActivity.TAG, "Cannot set image as wallpaper", e);
    }
}

public static Bitmap decodeSampledBitmapFromFile(String path, int width, int height) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(path, options);
    //String imageType = options.outMimeType;

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, width, height);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;

    return BitmapFactory.decodeFile(path, options);
}
/**
 * 
 * @param options
 * @param reqWidth
 * @param reqHeight
 * @return int
 * @see http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
 */
public static int calculateInSampleSize(BitmapFactory.Options options,
        int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        // Calculate ratios of height and width to requested height and
        // width
        final int heightRatio = Math.round((float) height
                / (float) reqHeight);
        final int widthRatio = Math.round((float) width / (float) reqWidth);

        // Choose the smallest ratio as inSampleSize value, this will
        // guarantee
        // a final image with both dimensions larger than or equal to the
        // requested height and width.
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }
    Log.d(MainActivity.TAG, " in sample Size: " + inSampleSize);
    return inSampleSize;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM