1

我正在使用 android:bottomOffset 使抽屉从底部伸出 100dip。效果很好,但我的内容不可见。只有当我触摸抽屉时它才可见。我怎样才能让它始终可见(100dip 显示内容)?

我首先认为这是一个可见性问题,因为内容的可见性设置为 GONE in onFinishInflate(), prepareContent(), closeDrawer()... 复制了 SlidingDrawer 并删除了这些行,并没有解决它。似乎这是一个位置问题,目前我正在玩数字,但仍然找不到如何使内容出现在它应该出现的位置......并且没有更多时间......任何帮助非常感谢。

这是问题的图片以便快速理解:

在此处输入图像描述

我希望它从一开始就看起来像在正确的部分。

这种默认行为对我来说也是错误的,我不知道为什么有人只想为句柄制作偏移量,在它和内容之间制造一个间隙,然后在触摸时将内容直接放在句柄下面......

4

2 回答 2

2

这是一个有效的解决方案:

创建 SlidingDrawer 类的完整副本,然后替换该方法dispatchDraw,使其如下所示:

@Override
protected void dispatchDraw(Canvas canvas) {
    final long drawingTime = getDrawingTime();
    final View handle = mHandle;
    final boolean isVertical = mVertical;

    drawChild(canvas, handle, drawingTime);

    //if (mTracking || mAnimating) {
        final Bitmap cache = mContent.getDrawingCache();
        if (cache != null) {
            if (isVertical) {
                canvas.drawBitmap(cache, 0, handle.getBottom(), null);
            } else {
                canvas.drawBitmap(cache, handle.getRight(), 0, null);                    
            }
        } else {
            canvas.save();
            canvas.translate(isVertical ? 0 : handle.getLeft() - mTopOffset,
                    isVertical ? handle.getTop() - mTopOffset : 0);
            drawChild(canvas, mContent, drawingTime);
            canvas.restore();
        }
    //} else if (mExpanded) {
        //drawChild(canvas, mContent, drawingTime);
    //}
}

我所做的是评论行。如您所见,mContent 是滑块的内容,仅当 mTracking、mAnimating 或 mExpanded 为 true 时才会绘制,而滑块“关闭”时则不然。可能开发人员没有想到在“关闭”时显示部分内容的滑块,因此在滑块关闭时绘制内容没有任何意义。

于 2012-07-19T23:44:46.423 回答
0

lxx 的答案完美无缺。我无法粘贴所有代码作为响应,所以我提出了另一个答案。与 lxx 的代码唯一不同的是,我没有复制所有 SlidingDrawer 类,而是通过创建新类来扩展它。以下是完整代码。

package com.localini.widget;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
import android.widget.SlidingDrawer;

public class ExtendedSlidingDrawer extends SlidingDrawer {

    private boolean mVertical;
    private int mTopOffset;

    public ExtendedSlidingDrawer(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        int orientation = attrs
                .getAttributeIntValue("android", "orientation", ORIENTATION_VERTICAL);
        mTopOffset = attrs.getAttributeIntValue("android", "topOffset", 0);
        mVertical = (orientation == SlidingDrawer.ORIENTATION_VERTICAL);
    }

    public ExtendedSlidingDrawer(Context context, AttributeSet attrs) {
        super(context, attrs);

        int orientation = attrs
                .getAttributeIntValue("android", "orientation", ORIENTATION_VERTICAL);
        mTopOffset = attrs.getAttributeIntValue("android", "topOffset", 0);
        mVertical = (orientation == SlidingDrawer.ORIENTATION_VERTICAL);
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        final long drawingTime = getDrawingTime();
        final View handle = getHandle();
        final boolean isVertical = mVertical;

        drawChild(canvas, handle, drawingTime);

        //if (mTracking || mAnimating) {
        final Bitmap cache = getContent().getDrawingCache();
        if (cache != null) {
            if (isVertical) {
                canvas.drawBitmap(cache, 0, handle.getBottom(), null);
            } else {
                canvas.drawBitmap(cache, handle.getRight(), 0, null);
            }
        } else {
            canvas.save();
            canvas.translate(isVertical ? 0 : handle.getLeft() - mTopOffset,
                        isVertical ? handle.getTop() - mTopOffset : 0);
            drawChild(canvas, getContent(), drawingTime);
            canvas.restore();
        }
        //} else if (mExpanded) {
        //drawChild(canvas, mContent, drawingTime);
        //}
    }
}

在 xml 布局文件中,您需要设置例如android:buttonOffser="-100dip"原始问题中的解释。

于 2013-03-23T19:37:23.327 回答