0

나는 사용자 정의보기를 만들려고하기로 결정했습니다. 두 레이어 (상단, 하단)에서 몇 가지 기능 (회전, 확대/축소, 변형, 오버레이 추가) 기능을 갖춘 편집기를 만들어야하며, 편리한 이미지 편집을 위해 하나의 레이아웃을 늘리기 위해 이동자를 이동할 수 있어야합니다. 비슷한 작품이 있습니까, 아니면 어떻게 시작할 지 상상해보십시오.안드로이드에 대한 이중화 된 사용자 정의보기를 만드는 방법은 무엇입니까?

how it should be

답변

1

나는 당신이 물어 무엇을 사용자 정의 레이아웃을했습니다.

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

해피 코딩

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 

사용 예 예에서와 같이 프로그램을 사용!

+0

고맙습니다. MAN)))) 당신은 내 하루를 만듭니다. –

+0

당신은이 태도로 나의 하루를 만들고있는 사람입니다! –

+0

Skype에 나를 추가 해주실 수 있습니까? 계정 : "violent.ua". 맞춤 레이아웃에서지도를 추가 할 때 해결할 수없는 문제가 있습니다. –

관련 문제