【问题标题】:android live wallpapers parallax-scrolling effect安卓动态壁纸视差滚动效果
【发布时间】:2013-04-10 11:54:48
【问题描述】:

当我们滚动时,主屏幕的前景(图标、小部件等)向左或向右移动整个屏幕宽度,但背景图像(或动态壁纸)仅移动该宽度的一小部分. 我的问题是如何获得这种效果。 到现在为止都这样做了。

    SurfaceHolder holder = getSurfaceHolder();
        Canvas canvas = null;
        try {
            canvas = holder.lockCanvas();
            if (canvas != null) {

                drawCircles(canvas);
            }
        } finally {
            if (canvas != null)
                holder.unlockCanvasAndPost(canvas);
        }

绘制函数是

{
    private void draw(Canvas canvas) {
        Paint paint = new Paint();
        DisplayMetrics metdisplayMatrics = new DisplayMetrics();
        Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
        display.getMetrics(metdisplayMatrics);

            canvas.save();
            canvas.drawColor(0xff000000);
            mRecscreenRectangleFrame = new Rect(0, 0,  (int) (metdisplayMatrics.widthPixels*2.0), metdisplayMatrics.heightPixels);
            photo1= BitmapFactory.decodeResource(getResources(), R.drawable.img1);
            canvas.drawBitmap(photo1, null,mRecscreenRectangleFrame, paint);
            photo1.recycle();
            System.gc();
}               

现在如何给动态壁纸加上视差滚动效果。

    @Override
    public void onOffsetsChanged(float xOffset, float yOffset,
            float xOffsetStep, float yOffsetStep, int xPixelOffset,
            int yPixelOffset) {

        super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep,
                xPixelOffset, yPixelOffset);

        WallpaperManager myWallpaperManager = WallpaperManager.getInstance(getApplicationContext());
        View view=new View(getBaseContext());

        myWallpaperManager.setWallpaperOffsets(view.getWindowToken(),xOffset, 0f);

    }

还不行......

【问题讨论】:

    标签: java android android-canvas live-wallpaper animationdrawable


    【解决方案1】:

    致电WallpaperManager.setWallpaperOffsets 指示壁纸滚动。

    Documentation

    所以这应该使壁纸居中:

    WallpaperManager.setWallpaperOffsets(getWindowToken(), 0.5f, 0f);
    

    这应该将它滚动到一边:

    WallpaperManager.setWallpaperOffsets(getWindowToken(), 0f, 0f);
    

    这应该将它滚动到另一边:

    WallpaperManager.setWallpaperOffsets(getWindowToken(), 1f, 0f);
    

    如果您要这样做,您应该确保您知道墙纸实际上可以滚动,或者用户已要求您启用滚动。许多设备都配置了与屏幕大小相同且不滚动的壁纸。

    【讨论】:

    • 谢谢 j__m 如果你能给我详细的答案我是 android 新手。
    • 新创建的视图不会有窗口令牌。你必须在已经可见的东西上调用 getWindowToken(),比如你的 SurfaceView。
    • 我有表面支架,但没有表面视图。如何获取窗口令牌。
    • ...我刚刚意识到您正在创建动态壁纸 -_-;;您的问题的措辞方式听起来像是您正在创建一个在墙纸上绘制的应用程序(例如启动器)。 setWallpaperOffsets 是启动器调用以调用您的 onOffsetsChanged 函数的函数;您不应该从动态壁纸内部调用 setWallpaperOffsets。相反,您需要更改 draw() 函数中的坐标。
    • 举个例子,在浏览五个主屏幕视图时移动背景图像
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多