0

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

how it should be

ответ

1

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

git repository here

preview

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); 

Счастливый кодирования!

+0

Большое вам спасибо, ЧЕЛОВЕК)))) Вы делаете мой день –

+0

Это тот, который делает мой день таким отношением! –

+0

Можете ли вы добавить меня в скайп? Счет: "violent.ua". У меня есть проблемы, которые я не могу решить о добавлении карты в свой собственный макет –