【问题标题】:How to implement Swipe events to animate(e.g. change alpha) Views?如何实现滑动事件以动画(例如更改 alpha)视图?
【发布时间】:2016-01-20 14:37:44
【问题描述】:

在我的应用程序中,我希望当用户从底部滑动到顶部时,ImageView 的 alpha 应该减小到某个点,如果用户从顶部滑动到底部,alpha 应该增加到 1。我尝试了很多事情还是没有成功

代码

 gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener());


        GestureDetector.SimpleOnGestureListener simpleOnGestureListener = new GestureDetector.SimpleOnGestureListener() {

            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

                float distanceX = 0;
                float distanceY = 0;

                try {

                    distanceX = e2.getX() - e1.getX();
                    distanceY = e2.getY() - e1.getY();

                } catch (Exception e) {

                }


                if (Math.abs(distanceY) > Math.abs(distanceX) && Math.abs(distanceY) > THRESHOLD && Math.abs(velocityY) > VELOCITY) {

                    if (distanceY > 0) {

                        //increase the alpha

                    } else {

                        //reduce the alpha


                    }
                    return true;

                }

                return false;


            }

        };

        gestureDetector = new GestureDetector(this, simpleOnGestureListener);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        return gestureDetector.onTouchEvent(event);
    }

【问题讨论】:

  • 请编辑问题以说明您面临的具体问题。
  • 嘿....我今天做了同样的功能并提交了 POC 这里的事情是我已经拍摄了整个图像的三张图像并根据图像点击更改了 alpha 跨度>
  • @gvsharma 有什么帮助吗??
  • 请澄清您的问题

标签: android android-animation android-gesture


【解决方案1】:

试试这个代码。它对我有用。

编辑: 先定义mAlpha实例变量然后复制粘贴下面的代码试试。

private float mAlpha = 1;

ImageView img = (ImageView) findViewById(R.id.img);
img.setOnTouchListener(new View.OnTouchListener() {
            float mDownY;
            private int mSwipeSlop = -1;

            @Override
            public boolean onTouch(final View v, MotionEvent event) {
                if (mSwipeSlop < 0) {
                    mSwipeSlop = ViewConfiguration.get(MainActivity.this).getScaledTouchSlop();
                }
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        if (mItemPressed) {
                            // Multi-item swipes not handled
                            return false;
                        }
                        mItemPressed = true;
                        mDownY = event.getY();
                        break;
                    case MotionEvent.ACTION_CANCEL:
                        mItemPressed = false;
                        break;
                    case MotionEvent.ACTION_MOVE:
                    {
                         float y = event.getY() + v.getTranslationY();
                         float deltaY = y - mDownY;
                         if (!mSwiping) {
                            if (deltaY > mSwipeSlop) {
                               mSwiping = true;
                            }
                         }
                         if (mSwiping) {
                            if (mAlpha > 1) {
                               mAlpha = 1;
                            } else if (mAlpha < 0) {
                               mAlpha = 0;
                            }
                            v.setAlpha(mAlpha);
                            mAlpha = mAlpha - deltaY / v.getWidth();
                        }
                    }
                    break;
                    case MotionEvent.ACTION_UP: {
                        mItemPressed = false;
                    }
                    break;
                    default:
                        return false;
                }
                return true;
            }
        });

【讨论】:

  • 是的,这段代码工作正常,但它只适用于向下滑动,我还想在从下到上滑动时增加 alpha
  • @SonaliPawar 我已经编辑了代码。请立即检查代码。
【解决方案2】:

它只是一个黑客。您可以尝试此代码并对其进行改进。

我的想法是我只是在ImageView 下使用垂直SeekBar 并使用SeekBar progressValue 来设置图像alpha。(注意:我已经通过Seekbar verticle在 xml 中旋转 270)。

Test.java

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.widget.ImageView;
import android.widget.SeekBar;

public class Test extends AppCompatActivity {

    private SeekBar seekBar;
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        imageView = (ImageView) findViewById(R.id.img);

        seekBar = (SeekBar) findViewById(R.id.seekBar1);
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                float val = ((float) (100 - progress));
                val = (float) ((val / 100) + 0.3); // minimum alpha is 0.3. you can change it. 
                if (val < 1.00) {
                    Log.e("progress", "" + val);
                    imageView.setAlpha(val);

                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }


        });
    }


}

activity_test.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/seekBarPrefBarContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <SeekBar
        android:id="@+id/seekBar1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:rotation="270" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white">

        <ImageView
            android:id="@+id/img"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/yourdrawable" />
    </LinearLayout>

</RelativeLayout>

【讨论】:

    【解决方案3】:

    @TdSoft 答案对我有用……但它仅适用于向下滑动。为了使它适用于上下滑动动作,我已经改变了这一点。

    case MotionEvent.ACTION_MOVE: {
    float y = event.getY() + v.getTranslationY();
    float deltaY = y - mDownY;
    float deltaYAbs = deltaY;
    boolean mSwiping = false;
    float mAlpha = 1 - deltaYAbs / v.getWidth();
    if (!mSwiping) {
        mSwiping = true;                    
        if (deltaYAbs > mSwipeSlop) {                    
        mAlpha = 1 - deltaYAbs / v.getWidth();                        
        } else {                    
        mAlpha = 1 + deltaYAbs / v.getWidth();                        
        }
    }                
    if (mSwiping) {
        v.setAlpha(mAlpha); 
    }
    break;                               
    

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 2011-06-23
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多