【问题标题】:Android stretch background image while dragging the imageviewAndroid在拖动imageview时拉伸背景图像
【发布时间】:2015-02-05 11:26:43
【问题描述】:

我正在尝试实现图像控件垂直滑块。图片在ScrollView 内。当涉及到ImageView 的垂直拖动时,相对布局的上边距总是提供不同的阅读。

如果向下拖动时大于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>

你能告诉我怎么做吗

  1. 获取我在滚动视图中滚动的偏移量?
  2. 我知道是获取触摸位置减去滚动位置加上图像Y位置,拖动完成后如何实现这个参数?
  3. 如何在相对布局中为 imageview 设置相对边界?将此背景图像作为图像视图取出是否更明智?
  4. 如果我以编程方式重新定位 6 个相对布局但达到相同的宽度,是否会影响滚动位置和 scollview 总高度?如果是这样,如何计算重新定位的偏移量 Y ?

以下是我截至 2 月 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;

            }

        });

【问题讨论】:

    标签: android scrollview drag ontouchlistener


    【解决方案1】:
    1. ScrollView调用getScrollY()方法获取Y索引(滚动索引)

    2. 如果我理解(否则请纠正我),您可以在 ImageView 和 RelativeLayout 之间获得一个框架(边界),为 ImageView 添加填充或边距。你只需要调用 android:padding="" 或 android:margin=""

    3. 如果新添加的RelativeLayout/ImageView 不完全适合可用空间,ScrollViewscrollY 的高度也会发生变化。添加完新布局后,您可以从 ScrollView 获取 scrollY 并查看 ScrollView 滚动到的位置。

    你能改进第 2、3 和 4 题吗?这很令人困惑。

    【讨论】: