2015-02-05 2 views
1

세로 슬라이더이미지 컨트롤을 구현하려고합니다. 이미지는 ScrollView 안에 있습니다. ImageView의 세로 끌기에 관해서는 상대 레이아웃의 위쪽 여백이 항상 다른 읽기를 제공합니다.이미지 뷰를 드래그하면서 Android 스트레치 배경 이미지

드래그하는 동안 600보다 큰 경우 상대 레이아웃의 배경 이미지가 드래그 한 이미지 위치와 함께 세로로 늘어납니다.

<ScrollView 
     android:id="@+id/scrollView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:fillViewport="true" > 
... 


    <RelativeLayout 
       android:id="@+id/relativeLayouyt6" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_alignParentLeft="true" 
       android:layout_below="@+id/rTop" 
       android:background="@drawable/plain" > 

       <ImageView 
        android:id="@+id/dragImage" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:src="@drawable/arrow_one" 
        android:visibility="gone" /> 
      </RelativeLayout> 

당신은 내가있는 ScrollView의를

  1. 을 스크롤 한 오프셋하는 방법을 말해 주시겠습니까?
  2. 나는 드래그를 마친 후이 매개 변수를 구현하는 방법을 터치 한 위치에서 스크롤 된 위치와 더하기 이미지 Y 위치를 얻는 것을 알고 있습니까?
  3. 상대 레이아웃 내에서 이미지 뷰의 상대적 경계를 설정하는 방법은 무엇입니까? 이 배경 이미지를 이미지 뷰로 가져 오는 것이 현명합니까?
  4. 6 개의 관련 레이아웃을 프로그래밍 방식으로 재배치했지만 동일한 너비까지 올라가면 스크롤링 위치와 Scollview 총 높이에 영향을 줍니까? 그렇다면 재 위치 지정을위한 오프셋 Y를 계산하는 방법은 무엇입니까?

아래 월 11로 내 코드입니다 :

dragImage.setOnTouchListener(new OnTouchListener(){ 
       //private int _xDelta; 
       private int _yDelta; 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       v.getParent().requestDisallowInterceptTouchEvent(true); 



       final float y = event.getY(); 

       switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        //_yDelta = Y - lParams.topMargin; 
        mOldY2 = y; 
        break; 
       case MotionEvent.ACTION_UP: 
        mViewPager.setPagingEnabled(true); 
        break; 
       case MotionEvent.ACTION_POINTER_DOWN: 
        break; 
       case MotionEvent.ACTION_POINTER_UP: 
        break; 
       case MotionEvent.ACTION_MOVE: 
        btn4.setBackgroundResource(R.drawable.fbl02); 
        final float dy = y - mOldY2; 
        mNewY2 += dy; 
        mOldY2 = y; 
        System.out.println(mNewY2);     

        while(mNewY2 > 224){ 
         mNewY2 -= 224; 
        } 

        while(mNewY2 < 157){ 
         mNewY2 += 157; 
        } 


        if(mNewY2 < 157 || mNewY2 > 224) 
         break; 

        v.setTranslationY((int)mNewY2); 

        v.invalidate(); 

        float power = (float) (51.5/67 -(0.2/67) * mNewY2) ; 
        System.out.println(power); 

        Float roundF = new Float(Math.round(power)); 
        midBandStick = roundF; 
        btn4.setText(String.valueOf(midBandStick)); 
        //} 
        //break; 
       } 
       return true; 

      } 
아래

내 코드 :

public static void setRLBelowAnother(RelativeLayout rA , RelativeLayout rB ){   
     RelativeLayout.LayoutParams rparam4 = 
       (android.widget.RelativeLayout.LayoutParams) rB.getLayoutParams(); 
     rparam4.addRule(RelativeLayout.BELOW, rA.getId());    
     rB.setLayoutParams(rparam4);    
    } 



      setRLBelowAnother(rTop , r1); 
      setRLBelowAnother(r1 , r2); 
      setRLBelowAnother(r2 , r6 ); 
      setRLBelowAnother(r6 , r3 ); 
      setRLBelowAnother(r3 , r4); 
      setRLBelowAnother(r4 , r5 ); 
    dragImage.setVisibility(View.VISIBLE); 
     dragImage.setImageResource(R.drawable.slide_lshort); 

     dragImage.setX((float) (0.15*screenWidth)); 
     dragImage.setY((float) (0.05*screenHeight)); 
     dragImage.setOnTouchListener(new OnTouchListener(){ 
      //private int _xDelta; 
      private int _yDelta; 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       v.getParent().requestDisallowInterceptTouchEvent(true); 
       final int X = (int) event.getX(); 
       final int Y = (int) event.getY(); 
       switch (event.getAction() & MotionEvent.ACTION_MASK) { 
       case MotionEvent.ACTION_DOWN: 



        RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) dragImage 
        .getLayoutParams(); 

        //_xDelta = X - lParams.leftMargin; 
        _yDelta = Y - lParams.topMargin; 
        break; 
       case MotionEvent.ACTION_UP: 
        mViewPager.setPagingEnabled(true); 

        break; 
       case MotionEvent.ACTION_POINTER_DOWN: 
        break; 
       case MotionEvent.ACTION_POINTER_UP: 
        break; 
       case MotionEvent.ACTION_MOVE: 

        midStick = 0.2f; 
        btn4.setBackgroundResource(R.drawable.fbl02); 

        RelativeLayout.LayoutParams ParamsA = (RelativeLayout.LayoutParams) dragImage 
        .getLayoutParams(); 
        //ParamsA.leftMargin = X - _xDelta; 
        ParamsA.topMargin = Y - _yDelta; 
        //ParamsA.rightMargin = -250; 
        ParamsA.bottomMargin = -250; 
        mViewPager.setPagingEnabled(false); 


        int offYb = 0; 
        int pos = ParamsA.topMargin + offYb ; 
        if(pos > -52 && pos < 582){ 
         dragImage.setLayoutParams(ParamsA); 
         System.out.println(ParamsA.topMargin); 
         float power = (float) (100 + (900/634) * ParamsA.topMargin) ; 
         Float roundF = new Float(Math.round(power)); 
         midStick = roundF; 
         btn4.setText(String.valueOf(midStick)); 

        } 
        break; 
       } 
       return true; 

      } 

     }); 

답변

0
  1. 를 호출 Y를 얻을 수있는 ScrollView에서 getScrollY() 방법 색인 (스크롤 된 색인)

  2. 내가 이해했다면 (그렇지 않으면 수정하십시오) ImageView와 RelativeLayout 사이에 프레임 (경계)을 가져 와서 ImageView에 여백 또는 여백을 추가 할 수 있습니다. 당신은 안드로이드 전화를해야합니다 패딩 = ""또는 안드로이드 : 마진 = ""새로운 추가 RelativeLayout의/이미지 뷰가 사용 가능한 공간에 완전히 적합하지 않는 경우

  3. ScrollView의 높이도 scrollY을 변경합니다 . 새 레이아웃 추가를 마치면 ScrollView에서 scrollY를 가져 와서 ScrollView가 스크롤 된 위치를 볼 수 있습니다.

질문 2, 3 및 4를 개선 할 수 있습니까? 그것은 매우 혼란 스럽습니다.