Android开发仿微信下拉关闭图片11

图片会跟随手指移动,只有是下滑时才会退出查看页面,其他情况会复位,直接当做ImageView使用即可,setViewCall方法是在下滑完成后要执行的操作,上,左,右,可自行扩展

onTouchEvent 监听手指坐标,GestureDetector 监听滑动的惯性,ViewHelper设置图片位移动画

public class FriendCircleView extends android.support.v7.widget.AppCompatImageView implements GestureDetector.OnGestureListener {

public FriendCircleView(Context context) {
    super(context);
    initView(context, null, 0);
}

public FriendCircleView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initView(context, attrs, 0);
}

public FriendCircleView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initView(context, attrs, defStyleAttr);
}

//设置滑动完成后的回调方法
public void setViewCall(FriendCircleViewCall viewCall) {
    this.viewCall = viewCall;
}

private void initView(Context context, AttributeSet attrs, int defStyleAttr) {
    screenHeight = ScreenUtils.getScreenHeight(context);
    detector = new GestureDetector(context, this);
}

private GestureDetector detector;

private int screenHeight;//设备屏幕高度
private float oldX, oldY;//手机放在屏幕的坐标
private float movY;//移动中在屏幕上的坐标
private float alphaPercent = 1f;//背景颜色透明度
private boolean isFinsh = false;//是否执行关闭页面的操作
private FriendCircleViewCall viewCall = null;

@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
    detector.onTouchEvent(event);
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            oldX = event.getRawX();
            oldY = event.getRawY();
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            if (isFinsh) {
                isFinsh = false;
                if (viewCall != null) {
                    viewCall.viewDestry();
                }
                Log.e("ldd------", "页面返回");
            } else {
                setupUping();
                Log.e("ldd------", "手指抬起");
            }
            break;
        case MotionEvent.ACTION_MOVE:
            isFinsh = false;
            float movX = event.getRawX() - oldX;
            movY = event.getRawY() - oldY;
            setupMoving(movX, movY);
            if (Math.abs(movX) > Math.abs(movY)) {
                if (movX < 0) {
                    Log.e("ldd------", "左滑动");
                } else {
                    Log.e("ldd------", "右滑动");
                }
            } else {
                if (movY < 0) {
                    Log.e("ldd------", "上滑动");
                } else {
                    if (movY > (screenHeight / 6)) {
                        isFinsh = true;
                        Log.e("ldd------", "下滑动");
                    }
                }
            }
            return false;
    }
    return true;
}

private void setupUping() {
    animate().setDuration(200)
            .scaleX(1)
            .scaleY(1)
            .translationX(0)
            .translationY(0)
            .setUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    if (alphaPercent < animation.getAnimatedFraction()) {
                        ((ViewGroup) getParent()).setBackgroundColor(convertPercentToBlackAlphaColor(animation.getAnimatedFraction()));
                    }
                }
            })
            .start();
}

private void setupMoving(float deltaX, float deltaY) {
    if (Math.abs(movY) < (screenHeight / 4)) {
        float scale = 1 - Math.abs(movY) / screenHeight;
        alphaPercent = 1 - Math.abs(deltaY) / (screenHeight / 2);
        ViewHelper.setScaleX(this, scale);
        ViewHelper.setScaleY(this, scale);
        ((ViewGroup) getParent()).setBackgroundColor(convertPercentToBlackAlphaColor(alphaPercent));
    }
    ViewHelper.setTranslationX(this, deltaX);
    ViewHelper.setTranslationY(this, deltaY);
}

//设置背景颜色透明度
protected int convertPercentToBlackAlphaColor(float percent) {
    percent = Math.min(1, Math.max(0, percent));
    int intAlpha = (int) (percent * 255);
    String stringAlpha = Integer.toHexString(intAlpha).toLowerCase();
    String color = "#" + (stringAlpha.length() < 2 ? "0" : "") + stringAlpha + "000000";
    return Color.parseColor(color);
}

@Override
public boolean onDown(MotionEvent e) {
    return false;
}

@Override
public void onShowPress(MotionEvent e) {

}

@Override
public boolean onSingleTapUp(MotionEvent e) {
    isFinsh = true;
    return false;
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    return false;
}

@Override
public void onLongPress(MotionEvent e) {

}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    float movX = e2.getRawX() - e1.getRawX();
    float movY = e2.getRawY() - e1.getRawY();
    Log.e("ldd------2", movX + "---------" + movY);
    if (Math.abs(movX) > Math.abs(movY)) {
        if (movX < 0) {
            Log.e("ldd------2", "左滑动");
        } else {
            Log.e("ldd------2", "右滑动");
        }
    } else {
        if (movY < 0) {
            Log.e("ldd------2", "上滑动");
        } else {
            isFinsh = true;
            Log.e("ldd------2", "下滑动");
        }
    }
    return true;
}

public interface FriendCircleViewCall {
    void viewDestry();
}

}

原文地址:https://www.cnblogs.com/l-d-d/p/10906989.html

时间: 2024-10-04 03:18:20

Android开发仿微信下拉关闭图片11的相关文章

PullDownListView高仿微信下拉眼睛出现动画

PullDownListView高仿微信下拉眼睛出现动画,动画自定义PullDownListView,pullDownListView.setOnPullHeightChangeListener设置下拉高度监听,onTopHeightChange()onBottomHeightChange(),onRefreshing()其中提供者三个方法时刻刷新页面特效 查看项目完整源码:http://www.itlanbao.com/code/20150911/10000/100524.html 引入布局:

超炫 PullDownListView高仿微信下拉眼睛出现动画

PullDownListView高仿微信下拉眼睛出现动画,动画自定义PullDownListView, pullDownListView.setOnPullHeightChangeListener设置下拉高度监听,onTopHeightChange() onBottomHeightChange(),onRefreshing()其中提供者三个方法时刻刷新页面特效 运行效果: 完整源码下载地址:http://www.itlanbao.com/code/20150911/10000/100524.ht

Android开发--仿微信语音对讲录音

自微信出现以来取得了很好的成绩,语音对讲的实现更加方便了人与人之间的交流.今天来实践一下微信的语音对讲的录音实现,这个也比较容易实现.在此,我将该按钮封装成为一个控件,并通过策略模式的方式实现录音和界面的解耦合,以方便我们在实际情况中对录音方法的不同需求(例如想要实现wav格式的编码时我们也就不能再使用MediaRecorder,而只能使用AudioRecord进行处理). 效果图: 实现思路 1.在微信中我们可以看到实现语音对讲的是通过点按按钮来完成的,因此在这里我选择重新自己的控件使其继承自

Android开发手记(10) 下拉菜单Spinner

1.自定义Spinner 首先,定义Spinner要显示的项目列表/res/values/arrays.xml 1 <?xml version="1.0" encoding="utf-8"?> 2 <resources> 3 <string-array name="citys"> 4 <item>南京</item> 5 <item>徐州</item> 6 <

[转]Android 超高仿微信图片选择器 图片该这么加载

快速加载本地图片缩略图的方法: Android 超高仿微信图片选择器 图片该这么加载 其示例下载: 仿微信图片选择器 ImageLoader

高仿墨迹天气下拉拉伸图片

简介 最近比较闲,就多学习了下,关键是不看点东西,就犯困啊.墨迹天气这个应用有不少地方需要学习的,这篇文章呢, 说一下他的"我"Tab页下拉拉伸图片展示效果,如果留意的话, 像QQ的好友动态也有差不多的效果. 代码分析 代码比较简单了,就重写了一个ScrollView类,先说说他的原理吧,我是先根据id拿到这个ImageView,然后获得他的TopMargin也就是遮掩后的偏移值,在触摸的时候,对ImageView的TopMargin进行改变产生效果,松手的时候搞个属性动画让他还原到以

ASP.NET仿新浪微博下拉加载更多数据瀑布流效果

闲来无事,琢磨着写点东西.貌似页面下拉加载数据,瀑布流的效果很火,各个网站都能见到各式各样的展示效果,原理大同小异.于是乎,决定自己写一写这个效果,希望能给比我还菜的菜鸟们一点参考价值. 在开始之前,先把实现的基本原理说一下.当夜幕下拉到底部的时候,js可以判断滚动条的位置,到达底部触发js方法,执行jquery的ajax方法,向后台一般处理程序夜幕ashx文件请求数据源,得到json格式的数据源.然后,遍历json数据源,拼接一个li标签,再填充到页面上去. 首先,我们来做个简单的html页面

Android PopupWindow 仿微信弹出效果

项目中,我需要PopupWindow的时候特别多,这个东西也特别的好使,所以我今天给大家写一款PopupWindow 仿微信弹出效果,这样大家直接拿到项目里就可以用了!首先让我们先看效果: 那么我首先先看下布局代码非常简单:如下 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pop_layout" android:layout_

Android开发中尽量避免使用jpg图片

由于jpg容易失真,所以在Android开发中尽量避免使用.jpg图片,而应该使用.png图片,它采用了从LZ77派生的无损数据压缩算法. 其实关于这点,Google已经暗示我们了: 发现了没有,在res下这些icon用的都是png格式.就是说Google推荐使用的是png格式的图片. 写到这,想起个小事,童鞋问:在命名一个Activity对应的布局文件的时候,怎么样算规范一些. 其实我们在新建一个Activity的时候,也可以在看到一些端倪: 如果你建立一个MainActivity那么默认的它