Как создать двойной вид для Android?

Я решил попробовать создать пользовательский вид. Необходимо создать редактор с некоторыми возможностями (вращение, масштабирование, преобразование, добавление оверлеев) на обоих слоях (вверху, внизу) и сделать возможным перемещение разделителя для увеличения одного макета для удобного редактирования изображений. Есть ли похожие работы или кто-то может представить, как правильно начать?

как это должно быть

1 ответ

Решение

Я сделал пользовательский макет, который делает то, что вы просили.
Используйте это программно, как в примере

Git репозиторий здесь

предварительный просмотр

public class BicontLayout extends LinearLayout {

    private View divider;
    private View vTop, vBottom;
    private LinearLayout.LayoutParams vTopParams, vBottomParams;
    private int dividerClickableHeight;

    public BicontLayout(Context ctx, View viewTop, View viewBottom) {
        super(ctx);

        this.vTop = viewTop;
        this.vBottom = viewBottom;

        setOrientation(LinearLayout.VERTICAL);
        setWeightSum(1f);

        vTopParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 0.5f);
        vBottomParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 0.5f);
        addView(vTop, vTopParams);

        divider = new View(ctx);
        divider.setBackgroundColor(Color.RED);

        dividerClickableHeight = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50f, getResources().getDisplayMetrics());
        addView(divider, LinearLayout.LayoutParams.MATCH_PARENT, 3);
        addView(vBottom, vBottomParams);

    }

    private float yStartTouch;
    private float yStartWeight;
    private boolean isDragging;
    private int[] dividerLocation = new int[2];

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if(onTouchEvent(ev)) return true;
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent me) {
        switch(me.getAction()) {
            case MotionEvent.ACTION_DOWN:
                yStartTouch = me.getRawY();
                yStartWeight = vTopParams.weight;
                divider.getLocationOnScreen(dividerLocation);
                isDragging = Math.abs(dividerLocation[1]-yStartTouch) < dividerClickableHeight/2;
                break;
            case MotionEvent.ACTION_MOVE:
                if(!isDragging) break;

                float yDelta = me.getRawY() - yStartTouch;
                float yDeltaProg = yDelta/BicontLayout.this.getHeight();
                float yNewProg = yStartWeight + yDeltaProg;
                if(yNewProg<0.1f) yNewProg=0.1f;
                if(yNewProg>0.9f) yNewProg=0.9f;

                vTopParams.weight = yNewProg;
                vTop.setLayoutParams(vTopParams);

                vBottomParams.weight = 1f - yNewProg;
                vBottom.setLayoutParams(vBottomParams);

                break;
            case MotionEvent.ACTION_UP:
                isDragging=false;
                break;
        }

        if(isDragging) return true;
        return super.onTouchEvent(me);
    }

} // author Tiziano Munegato

Пример использования

// vTop : top view
// vBottom : bottom view
BicontLayout doubleLayout = new BicontLayout(getContext(), vTop, vBottom);
setContentView(doubleLayout);

Удачного кодирования!

Другие вопросы по тегам