简体   繁体   English

Android动态壁纸缩放

[英]Android live wallpaper scaling

I'm learning android and java and am trying to learn how to make a live wallpaper I am using the aquarium tutorial, I put it all in one file instead of spreading it but what I am trying to do is get one scale number for everything, I want to get the height of the screen divide that by the background image height (which will always be bigger), this should give me a ratio to use for scaling everything, I tried this in a surfaceView code and it worked perfect, I tried it in livewallpaper and nada. 我正在学习android和java,正在尝试学习如何制作动态壁纸,我正在使用水族馆教程,我将其全部放在一个文件中而不是传播出去,但是我想做的是为所有事情获得一个标度数字,我想得到屏幕的高度除以背景图像的高度(它将始终更大),这应该给我一个用于缩放所有内容的比率,我在surfaceView代码中尝试了一下,并且效果很好,我在livewallpaper和nada中尝试过。 In the surfaceView test I use onSizeChange and got the height that way and it worked no problems. 在surfaceView测试中,我使用onSizeChange并以这种方式获得了高度,并且没有任何问题。 This is what I did for the livewallpaper one This is what I put for the onSurfaceChange 这是我为livewallpaper做的事情这是我为onSurfaceChange做的事情

public int screenWidth;
public float rescaler;
public float totalHeight = theTemplate._backgroundImage.getHeight();

@Override
public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    //add rescale and width
    screenWidth = width;
    rescaler = (float) (height / totalHeight);
    super.onSurfaceChanged(holder, format, width, height);          
}

The background image comes from an inner class named TheTemplate This is what I did there The variables 背景图像来自一个名为TheTemplate的内部类。这就是我在那里所做的。

private SpriteAnimationActivityEngine theTest;
private Bitmap theBackgroundImage;
private float theScaler = theTest.rescaler;

then I try and rescale it using theScaler 然后我尝试使用Scaler重新缩放

public void initialize(Context context, SurfaceHolder surfaceHolder) {
    this.spriteThread = new SpriteThread(this); 
    this._surfaceHolder = surfaceHolder;        
    this._sprites = new ArrayList<Renderable>();
    this._context = context;
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPurgeable = true;
    this._backgroundImage = BitmapFactory.decodeResource(context.getResources(),ca.samsstuff.testonepagewallpaper.R.drawable.sky, options);
    this.theBackgroundImage = Bitmap.createScaledBitmap(_backgroundImage,  (int) (theScaler * _backgroundImage.getWidth()),  (int) (theScaler * _backgroundImage.getHeight()), true);
    this.addSprites();
}

Then it passes it to draw the background 然后将其传递以绘制背景

private void renderBackGround(Canvas canvas) {
    canvas.drawBitmap(this.theBackgroundImage, 0, 0, null);
}

Which sends it to draw 哪个发送它画

protected void onDraw(Canvas canvas) {
    this.renderBackGround(canvas);              
    for (Renderable renderable : this._sprites) {
        renderable.render(canvas);
    }
}

I keep getting errors and don't know what I am doing wrong. 我不断收到错误,也不知道我在做什么错。 Like I said I am learning both android and java but this method worked in another test I did but I got the screen height from onSizeChange can I get the height by using onSurfaceChange? 就像我说的那样,我正在学习android和java,但是此方法在我做过的另一项测试中有效,但是我从onSizeChange获得了屏幕高度,可以通过使用onSurfaceChange获得高度吗?

Any help would be appreciated Thanks in advance sam 任何帮助将不胜感激提前感谢山姆

EDIT I also tried to rescale within the theTemplate class just to see if it would work having everything within its own class and still having issues, I used the DisplayMetrics to get the screen height this time. 编辑我也尝试在TheTemplate类中重新缩放,只是为了查看它是否具有其自身类中的所有内容并且仍然有问题,我这次使用DisplayMetrics来获取屏幕高度。 This might work if I can get it going properly. 如果我可以正常进行,这可能会起作用。 Here is this attempt 这是尝试

public class TheTemplate {

        private SpriteThread spriteThread;  
        private SurfaceHolder _surfaceHolder;   
        private ArrayList<Renderable> _sprites; 
        public Bitmap _backgroundImage = BitmapFactory.decodeResource(getResources(), R.drawable.sky);;
        private Context _context;

        // add rescale stuff
        private Bitmap theBackgroundImage;
        private float theScaler = initFrameParams() / _backgroundImage.getHeight();
        private Bitmap oneBackImage = Bitmap.createScaledBitmap(_backgroundImage,  (int) (theScaler * _backgroundImage.getWidth()),  (int) (theScaler * _backgroundImage.getHeight()), true);

        int initFrameParams()
        {
                            //get the screen height to use to rescale everything
            DisplayMetrics metrics = new DisplayMetrics();
            Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
            display.getMetrics(metrics);

            int screenHeight = display.getHeight();
            return screenHeight;


        }


        public void render(){
            Canvas canvas = null;
            try{

                canvas = this._surfaceHolder.lockCanvas(null);
                synchronized (this._surfaceHolder) {
                    this.onDraw(canvas);
                }

            }finally{
                if(canvas != null){
                    this._surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }   
        }

        protected void onDraw(Canvas canvas) {
            this.renderBackGround(canvas);              
            for (Renderable renderable : this._sprites) {
                renderable.render(canvas);
            }
        };

        public void start(){
            this.spriteThread.switchOn();
        }

        public void stop(){
            boolean retry = true;
            this.spriteThread.switchOff();
            while (retry) {
                try {
                 this.spriteThread.join();
                    retry = false;
                } catch (InterruptedException e) {
                    // we will try it again and again...
                }
            }
        }

        public int getLeft() {      
            return 0;
        }


        public int getRight() {
            return this.theBackgroundImage.getWidth();
        }

        public void initialize(Context context, SurfaceHolder surfaceHolder) {
            this.spriteThread = new SpriteThread(this); 
            this._surfaceHolder = surfaceHolder;        
            this._sprites = new ArrayList<Renderable>();
            this._context = context;
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPurgeable = true;
            this.theBackgroundImage = oneBackImage;
            this.addSprites();
        }


        private void addSprites() {     
            Point startPoint = new Point(100, 100);
            this._sprites.add(new SpriteOne(this._context, this, startPoint, 90));
            Point startPoint1 = new Point(100, 300);
            this._sprites.add(new SpriteOne(this._context, this, startPoint1, 50));

            Point startPoint2 = new Point(200, 200);
            this._sprites.add(new SpriteOne(this._context, this, startPoint2, 15));
        }

        private void renderBackGround(Canvas canvas)
        {
            canvas.drawBitmap(this.theBackgroundImage, 0, 0, null);
        }
    }

As I stated before any help would be appreciated. 正如我之前所说,任何帮助将不胜感激。 Thanks again in advance Sam 预先再次感谢Sam

Edit SOLVED Here is an answer I came up with, The rescale code is where the comments are Hope this helps someone out. 编辑已解决这是我想出的一个答案,重新缩放代码是注释所在,希望这可以帮助某人。

public class TheTemplate {  

            private SpriteThread spriteThread;    
            private SurfaceHolder _surfaceHolder;     
            private ArrayList<Renderable> _sprites;     
            public Bitmap _backgroundImage = BitmapFactory.decodeResource(getResources(), R.drawable.sky);;  
            private Context _context;  

            // add rescale stuff  
            //private SpriteAnimationActivityEngine theTest;  
            private Bitmap theBackgroundImage;  
            private float totalHeight = _backgroundImage.getHeight();  
            private int screenSized = initFrameParams();  
            private float theScaler = (float) (screenSized / totalHeight);  

            private Bitmap oneBackImage = Bitmap.createScaledBitmap(_backgroundImage,  (int) (theScaler * _backgroundImage.getWidth()),  (int) (theScaler * _backgroundImage.getHeight()), true);  


            int initFrameParams()  
            {  
                DisplayMetrics metrics = new DisplayMetrics();  
                Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();  
                display.getMetrics(metrics);  

                int screenHeight = display.getHeight();  
                return screenHeight;  
            }  


            public void render(){  
                Canvas canvas = null;  
                try{  

                    canvas = this._surfaceHolder.lockCanvas(null);  
                    synchronized (this._surfaceHolder) {  
                        this.onDraw(canvas);  
                    }  

                }finally{  
                    if(canvas != null){  
                        this._surfaceHolder.unlockCanvasAndPost(canvas);  
                    }  
                }     
            }  

            protected void onDraw(Canvas canvas) {  
                this.renderBackGround(canvas);                
                for (Renderable renderable : this._sprites) {  
                    renderable.render(canvas);  
                }  
            };  

            public void start(){  
                this.spriteThread.switchOn();  
            }  

            public void stop(){  
                boolean retry = true;  
                this.spriteThread.switchOff();  
                while (retry) {  
                    try {  
                     this.spriteThread.join();  
                        retry = false;  
                    } catch (InterruptedException e) {  
                        // we will try it again and again...  
                    }  
                }  
            }  

            public int getLeft() {        
                return 0;  
            }  


            public int getRight() {  
                return this.theBackgroundImage.getWidth();  
            }  

            public void initialize(Context context, SurfaceHolder surfaceHolder) {  
                this.spriteThread = new SpriteThread(this);   
                this._surfaceHolder = surfaceHolder;          
                this._sprites = new ArrayList<Renderable>();  
                this._context = context;  
                BitmapFactory.Options options = new BitmapFactory.Options();  
                options.inPurgeable = true;  
                this.theBackgroundImage = oneBackImage;  
                this.addSprites();  
            }  


            private void addSprites() {       
                Point startPoint = new Point(100, 100);  
                this._sprites.add(new SpriteOne(this._context, this, startPoint, 90));  
                Point startPoint1 = new Point(100, 300);  
                this._sprites.add(new SpriteOne(this._context, this, startPoint1, 50));  

                Point startPoint2 = new Point(200, 200);  
                this._sprites.add(new SpriteOne(this._context, this, startPoint2, 15));  
            }  

            private void renderBackGround(Canvas canvas)  
            {  
                canvas.drawBitmap(this.theBackgroundImage, 0, 0, null);  
            }  
        }  

I added the answer to the original post, hope this helps someone. 我在原始帖子中添加了答案,希望对您有所帮助。 Sam Sorry about that folks, new to this method of using a forum Here is the answer, I added comments in the code where I made the changes for scaling images. Sam Sorry,关于人员,这是使用论坛这种方法的新手。这是答案,我在代码中添加了注释,在其中对缩放图像进行了更改。 This method can also be used for positioning also. 该方法也可以用于定位。 Here is the answer. 这是答案。

 public class TheTemplate {  

        private SpriteThread spriteThread;    
        private SurfaceHolder _surfaceHolder;     
        private ArrayList<Renderable> _sprites;     
        public Bitmap _backgroundImage = BitmapFactory.decodeResource(getResources(), R.drawable.sky);;  
        private Context _context;  

        // add rescale stuff  
        //private SpriteAnimationActivityEngine theTest;  
        private Bitmap theBackgroundImage;  
        private float totalHeight = _backgroundImage.getHeight();  
        private int screenSized = initFrameParams();  
        private float theScaler = (float) (screenSized / totalHeight);  

        private Bitmap oneBackImage = Bitmap.createScaledBitmap(_backgroundImage,  (int) (theScaler * _backgroundImage.getWidth()),  (int) (theScaler * _backgroundImage.getHeight()), true);  


        int initFrameParams()  
        {  
            DisplayMetrics metrics = new DisplayMetrics();  
            Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();  
            display.getMetrics(metrics);  

            int screenHeight = display.getHeight();  
            return screenHeight;  
        }  


        public void render(){  
            Canvas canvas = null;  
            try{  

                canvas = this._surfaceHolder.lockCanvas(null);  
                synchronized (this._surfaceHolder) {  
                    this.onDraw(canvas);  
                }  

            }finally{  
                if(canvas != null){  
                    this._surfaceHolder.unlockCanvasAndPost(canvas);  
                }  
            }     
        }  

        protected void onDraw(Canvas canvas) {  
            this.renderBackGround(canvas);                
            for (Renderable renderable : this._sprites) {  
                renderable.render(canvas);  
            }  
        };  

        public void start(){  
            this.spriteThread.switchOn();  
        }  

        public void stop(){  
            boolean retry = true;  
            this.spriteThread.switchOff();  
            while (retry) {  
                try {  
                 this.spriteThread.join();  
                    retry = false;  
                } catch (InterruptedException e) {  
                    // we will try it again and again...  
                }  
            }  
        }  

        public int getLeft() {        
            return 0;  
        }  


        public int getRight() {  
            return this.theBackgroundImage.getWidth();  
        }  

        public void initialize(Context context, SurfaceHolder surfaceHolder) {  
            this.spriteThread = new SpriteThread(this);   
            this._surfaceHolder = surfaceHolder;          
            this._sprites = new ArrayList<Renderable>();  
            this._context = context;  
            BitmapFactory.Options options = new BitmapFactory.Options();  
            options.inPurgeable = true;  
            this.theBackgroundImage = oneBackImage;  
            this.addSprites();  
        }  


        private void addSprites() {       
            Point startPoint = new Point(100, 100);  
            this._sprites.add(new SpriteOne(this._context, this, startPoint, 90));  
            Point startPoint1 = new Point(100, 300);  
            this._sprites.add(new SpriteOne(this._context, this, startPoint1, 50));  

            Point startPoint2 = new Point(200, 200);  
            this._sprites.add(new SpriteOne(this._context, this, startPoint2, 15));  
        }  

        private void renderBackGround(Canvas canvas)  
        {  
            canvas.drawBitmap(this.theBackgroundImage, 0, 0, null);  
        }  
    }  

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

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