• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 滑动关闭activity,滑动activity

滑动关闭activity,滑动activity

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了滑动切换activity,android activity滑动,activity 滑动退出,activity 滑动,android 关闭activity等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

滑动关闭activity,滑动activity


对于微信滑动关闭activity的功能,我一直觉得挺酷,想在自己的项目上也加上这个功能。网上找了一下发现一个不错的思路。

使用ViewDragHelper。

首先要让activity在滑动的时候下面的activity能够看得到,那么就得设置activity的主题,让activity的窗口变透明。

<style name="MyActivityBackground" parent="MyAppTheme">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Activity</item>
</style>

该主题继承MyAppTheme(这也是个自定义的主题,整个application就是用这个主题,为了不避免冲突,继承它)。
尤其要注意的是windowAnimationStyle,这个是设置activity的进入与退出的动画效果,设置为默认的效果。

然后在需要实现滑动退出的activity的注册文件上用上这个主题就行了。

 以下是全部代码

public class MyDragViewGroup extends FrameLayout{

    private ViewDragHelper mViewDragHelper;

    //该自定义组件的宽
    private int mWidth;

    //该自定义组件的高
    private int mHeight;

    //需要滑动的组件目前已经滑动的距离
    private int currentLeft;

    //该滑动距离用于判断是否可以将activity关闭
    private int mSlidX;

    private static final int x=40;
    private Context mContext;

    //需要滑动的view
    private View view;

    private Paint mPaint;

    public MyDragViewGroup(Context context) {
        super(context);
        initView(context);
    }

    public void bind()
    {
        //获取activity的视图
        ViewGroup viewGroup= (ViewGroup) ((Activity)mContext).getWindow().getDecorView();
        view=viewGroup.getChildAt(0);

        viewGroup.removeView(view); //将该视图移除
        addView(view);  //将该视图添加进去这个自定义的组件
        viewGroup.addView(this); //将该自定义的组件整个添加进decorView
    }


    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mWidth=getMeasuredWidth();
        mHeight=getMeasuredHeight();
        mSlidX= (int) (mWidth*0.3);
    }

    private void initView(Context context)
    {
        mContext=context;

        mViewDragHelper=ViewDragHelper.create(this,callback);
        //边缘检测
        mViewDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);

        mPaint=new Paint();
        mPaint.setStrokeWidth(2);
        mPaint.setAntiAlias(true);
        mPaint.setColor(Color.GRAY);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return mViewDragHelper.shouldInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mViewDragHelper.processTouchEvent(event);
        return true;
    }


    private ViewDragHelper.Callback callback=new ViewDragHelper.Callback() {
        @Override
        public boolean tryCaptureView(View child, int pointerId) {
            return false;
        }

        @Override
        public int clampViewPositionVertical(View child, int top, int dy) {
            return 0;
        }

        @Override
        public int clampViewPositionHorizontal(View child, int left, int dx) {
            return left;
        }

        @Override
        public void onViewReleased(View releasedChild, float xvel, float yvel) {
            super.onViewReleased(releasedChild, xvel, yvel);

            //如果滑动的距离小于mSlidX,那么就滑回原处
            if (view.getLeft()<mSlidX)
            {
                mViewDragHelper.smoothSlideViewTo(view,0,0);
                ViewCompat.postInvalidateOnAnimation(MyDragViewGroup.this);
            }
            //否则滑出屏幕
            else
            {
                mViewDragHelper.smoothSlideViewTo(view,mWidth,0);
                ViewCompat.postInvalidateOnAnimation(MyDragViewGroup.this);
            }
            invalidate();
        }

        @Override
        public void onEdgeDragStarted(int edgeFlags, int pointerId) {
            mViewDragHelper.captureChildView(view,pointerId);
        }

        @Override
        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
            currentLeft=left;
            invalidate();
            if (left>=mWidth)
            {
                ((Activity)mContext).finish();
            }
        }
    };

    @Override
    public void computeScroll() {
        if (mViewDragHelper.continueSettling(true))
        {
            ViewCompat.postInvalidateOnAnimation(this);
            invalidate();
        }
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        drawShadow(canvas);
        super.dispatchDraw(canvas);
    }

    protected void drawShadow(Canvas canvas) {
        canvas.save();

        Shader mShader=new LinearGradient(currentLeft - x, 0, currentLeft, 0, new int[]{Color.parseColor("#1edddddd"),
                Color.parseColor("#6e666666"), Color.parseColor("#9e666666")}, null, Shader.TileMode.REPEAT);
        mPaint.setShader(mShader);
        //绘制时,注意向左边偏移
        RectF rectF = new RectF(currentLeft - x, 0, currentLeft, mHeight);
        canvas.drawRect(rectF, mPaint);
        canvas.restore();
    }
}

如果知道ViewDragHelper的使用,那么上面的代码很容易看得明白。drawShadow()是为了绘制阴影,注意在滑动的过程中要不断的刷新重绘,让阴影跟随着activity的移动而移动。

 

值得注意的是ViewGroup容器组件的绘制,当它没有背景时直接调用的是dispatchDraw()

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 滑动关闭activity,滑动activity

相关文章

  • 2017-05-26Android中AlarmManager使用示例(持续更新,已经更改),alarmmanager
  • 2017-05-26android 4.2 系统以后的飞行模式,android4.2
  • 2017-05-26Android网络编程(二)HttpClient与HttpURLConnection
  • 2017-05-26java 接口的作用和好处,java接口好处
  • 2017-05-26android adb pull push,androidadb
  • 2017-05-26SDK manager.exe 运行时报错:系统找不到指定的文件 android.bat,sdkmanager.bat
  • 2017-05-26使用phonegap播放音频,phonegap播放音频
  • 2017-05-26硅谷社交3--登录页面,硅谷社交3--
  • 2017-05-26Android 学习2----页面布局的学习,android2----
  • 2017-05-26Android程序版本更新--通知栏更新下载安装,android程序版本

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • mmap实现分析
    • Docker+Redis3集群环境搭建
    • cobbler系统使用之二高级篇的补充篇---关于kickstart文件内容的配置说明
    • [转]File Descriptor泄漏导致Crash: Too many open files,descriptorcrash
    • Android实现支付宝支付
    • android视图学习---从源码角度来理解onMeasure过程
    • 认识一下Kotlin语言 Android平台的Swift
    • 安卓GreenDao框架一些进阶用法整理,安卓greendao
    • Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define ...,dalvikdex
    • 六款值得推荐的android(安卓)开源框架简介(转),android安卓

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有