【问题标题】:Changing Live wallpaper based on user selected interval根据用户选择的时间间隔更改动态壁纸
【发布时间】:2019-08-21 13:59:52
【问题描述】:

我是安卓开发新手。我开发了一个应用程序来设置直播 壁纸和壁纸将根据用户选择的时间间隔改变 落下。我已经使用 WallpaperService 来实现这一点。处理程序 runnable 用于设置壁纸和 handler.postDelayed(runnable, WALLPAPER_DURATION);用于触发 更改所选间隔的墙纸。问题是壁纸 当用户更改为另一个时,旋转第一个选定的时间间隔 间隔说从5分钟到10分钟,壁纸应该每换一次 10 分钟,但我的代码仍在更改 5 分钟。我能够得到 用户更改了服务的时间间隔,但我无法杀死 可在 handler.postDelayed 中运行。我用过
handler.removeCallbacks(drawRunner); handler.removeCallbacksAndMessages(null);但有帮助。我想要 使用新的延迟时间(间隔)杀死或更新可运行对象。

Runnable drawRunner = new Runnable() {
            @Override
            public void run() {
                System.out.println("TIMER SCHEDULED "+WALLPAPER_DURATION);
                drawFrame();
                incrementCounter();
            }

        };
        public MyWallpaperEngine() {
            System.out.println("MyWallpaperEngine ");
            mImagesArray = new int[] {R.drawable.one,R.drawable.two,R.drawable.three,
                    R.drawable.four,R.drawable.five,R.drawable.six,
                    R.drawable.seven,R.drawable.eight,R.drawable.nine,
                    R.drawable.ten};
            handler.post(drawRunner);
        }

        private void incrementCounter() {
            mImagesArrayIndex++;

            if (mImagesArrayIndex >= mImagesArray.length) {
                mImagesArrayIndex = 0;
            }
        }

        private void drawFrame() {
            System.out.println("inside draw frame");
            SurfaceHolder holder = getSurfaceHolder();
            System.out.println("holder Object " + holder);
            Canvas canvas = null;

            try {
                canvas = holder.lockCanvas();
                System.out.println("Canvas Object " + canvas);
                if (canvas != null) {
                    System.out.println("inside draw image");
                    drawImage(canvas);
                }
            } finally {
                if (canvas != null) {
                    holder.unlockCanvasAndPost(canvas);
                }
            }

            handler.postDelayed(drawRunner, WALLPAPER_DURATION);
            if(clearHandler){
                    System.out.println("inside remove callbacks");
                   handler.removeCallbacks(drawRunner);
                  handler.removeCallbacksAndMessages(null);
                  clearHandler=false;
            }
        }


        @Override
        public void onSurfaceDestroyed(SurfaceHolder holder) {
            System.out.println("onSurfaceDestroyed is called");
            super.onSurfaceDestroyed(holder);
            //handler.removeCallbacks(drawRunner);
            //handler.removeCallbacksAndMessages(null);
        }

        private void drawImage(Canvas canvas)
        {
            Bitmap image = BitmapFactory.decodeResource(getResources(),
                    mImagesArray[mImagesArrayIndex]);
            Bitmap b=Bitmap.createScaledBitmap(image, canvas.getWidth(), canvas.getHeight(), true);
            canvas.drawBitmap(b, 0,0, null);
        }

        public void onDestroy(){
            super.onDestroy();
        //    handler.removeCallbacks(drawRunner);
          //  handler.removeCallbacksAndMessages(null);

        }
    }

【问题讨论】:

    标签: android intervals android-handler wallpaper live-wallpaper


    【解决方案1】:

    使用此基本代码。

    private final Handler handler = new Handler();
            private final Runnable drawRunnable = new Runnable() {
                @Override
                public void run() {
                    iteration();
                    draw();
                }
            };
            protected void iteration(){
                handler.removeCallbacks( drawRunnable );
                if( visible ){
                    handler.postDelayed( drawRunnable, 1000);
                }
            }
    

    【讨论】:

    • 我能知道我的代码和你的建议有什么区别吗?你在一个方法中调用了 removecallbacks 和 postdelay,我在 draw 方法本身中也做了同样的事情。此外,即使手机处于睡眠模式,我也希望更新壁纸。如果我将 postdelay 放在可见的内部,它将仅在主屏幕上醒来时更新。如果我错了,请纠正我
    • @Override public void onVisibilityChanged(boolean isVisible){ if( isVisible ){ handler.post( drawRunnable ); }else{ handler.removeCallbacks(drawRunnable); } }
    • Onvisibitychanged 只会在清醒时触发,对吧?我不想要这个。我想在睡眠模式下设置壁纸,这样我就不会覆盖这个方法
    • 我很需要,也很重要。请帮忙解决这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多