如何在android中设置壁纸到设备的整个屏幕

时间:2014-03-20 10:56:37

标签: android image fullscreen wallpaper

我在我的Android应用程序中使用set as wallpaper。但是当我将图像设置为壁纸时,它会在某种程度上放大设备。当我将图像设置为壁纸时我想要。这适用于每个屏幕设备。我正在使用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;
        }
    }
}

先谢谢。

5 个答案:

答案 0 :(得分:0)

我在我的应用中使用此库 它很有效,而且很容易

CropImage

它是开源的,因此您可以根据需要编辑库
玩得开心

答案 1 :(得分:0)

尝试此代码将图像设置为墙纸

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

答案 2 :(得分:0)

我猜你需要一个Image缩放算法来维持图像宽高比, 将您拥有的最佳图像存储在可绘制文件夹中,然后让Algorithm缩小最佳图像以适合设备的Height&amp; 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);
    }

答案 3 :(得分:0)

试试这个 -

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

答案 4 :(得分:0)

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);