Сделать часть содержимого SlidingDrawer всегда видимой?

Я использую android:bottomOffset, чтобы ящик торчал на 100 градусов снизу. Это работает нормально, но мой контент не виден. Это видно только когда я дотрагиваюсь до ящика. Как я могу сделать так, чтобы он всегда был виден (100dip показывает содержимое)?

Сначала я подумал, что это проблема видимости, потому что для видимости содержимого установлено значение GONE в onFinishInflate(), prepareContent(), closeDrawer()... скопировал SlidingDrawer и удалил эти строки, но это не решило. Кажется, это проблема с положением, в настоящее время я играю с числами, но до сих пор не нахожу, как сделать так, чтобы контент отображался там, где он должен быть... и у меня нет больше времени для этого... любая помощь высоко ценится.

Вот фото проблемы для быстрого понимания:

введите здесь описание изображения

Я хочу, чтобы это выглядело в правильной части, с самого начала.

Это поведение по умолчанию также кажется мне ошибочным, я не знаю, почему кто-то захочет сделать смещение только для дескриптора, сделав зазор между ним и содержимым, а затем при касании поместить содержимое прямо под дескриптор...


person User    schedule 15.07.2012    source источник
comment
Зачем это делать? Если содержимое всегда будет видно, зачем возиться с выдвижным ящиком?   -  person Barak    schedule 15.07.2012
comment
Пожалуйста, прочитайте вопрос, речь идет о части 100dip, а не о всем содержании.   -  person User    schedule 15.07.2012
comment
Не ясно из исходной версии вопроса. Звучало так, будто 100dp — это все.   -  person Barak    schedule 15.07.2012
comment
А, нет, извините, это всего лишь первые 100 дипов, контента гораздо больше.   -  person User    schedule 15.07.2012
comment
@lxx вы могли щелкнуть видимые элементы списка, когда ящик свернут?   -  person Brajesh Kumar    schedule 31.08.2015


Ответы (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, чего не происходит, когда ползунок «закрыт». Вероятно, разработчики не имели в виду ползунок, показывающий часть контента в "закрытом" состоянии, поэтому отрисовывать контент, когда слайдер закрыт, не имело смысла.

person User    schedule 19.07.2012
comment
@lxx Эй, в моем случае в первом ряду (видимая часть) у меня есть кнопки. Я не могу щелкнуть по ним, когда ящик закрыт, и часть моего содержимого видна. Не могли бы вы предложить, как я могу этого достичь? - person Brajesh Kumar; 31.08.2015

Ответы 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" как объяснено в исходном вопросе.

person Dragan Marjanović    schedule 23.03.2013
comment
Да, продлевать - правильно. Раньше комментировать строки было нельзя, из-за приватных членов, насколько я помню. И я его после этого не менял. - person User; 28.03.2013
comment
@ Драган Марьянович Эй, в моем случае в первом ряду (видимая часть) у меня есть кнопки. Я не могу щелкнуть по ним, когда ящик закрыт, и часть моего содержимого видна. Не могли бы вы предложить, как я могу этого достичь? – - person Brajesh Kumar; 31.08.2015