android开发教程之实现滑动关闭fragment示例_Android

分享到:

主要代码:(有注释)


package com.example.checkboxtest;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

public class MyView extends ViewGroup {
    View leftView = null;
    View rightView = null;

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        View view = new View(context, attrs);
        view.setBackgroundColor(Color.BLACK);
        this.addView(view, 0);
    }

    /**
     * 测量
     */
    @SuppressLint("DrawAllocation")
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (getChildCount() != 2) {
            try {
                // 自定义Exception
                throw new Exception() {
                    @Override
                    public void printStackTrace() {
                        System.err.println("MyView中只能存在一个View");
                        super.printStackTrace();
                    }

                };
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        leftView = getChildAt(0);
        // 设置leftview的高和宽
        leftView.measure(widthMeasureSpec, heightMeasureSpec);
        rightView = getChildAt(1);
        // 设置rightview的高和宽
        rightView.measure(widthMeasureSpec, heightMeasureSpec);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    /**
     * 布局
     */
    @SuppressLint("NewApi")
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        System.out.println(l + "," + t + "," + r + "," + b);
        if (leftView != null & rightView != null) {
            // 设置leftview的位置,在屏幕右侧(初始不可见)
            leftView.layout(-r, 0, 0, b);
            // 设置rightView的位置,在屏幕中
            rightView.layout(l, t, r, b);
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

    }

    @SuppressLint("NewApi")
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        final float X = event.getX();
        float Y = event.getY();
        switch (event.getAction()) {

        case MotionEvent.ACTION_MOVE:
            System.out.println("X:" + X);
            if (X < 100) {
                scrollTo(0, 0);
            } else if (X > rightView.getMeasuredWidth() - 100) {// 当用户滑动至离右边缘100时,页面关闭
                new Thread(new Runnable() {// 新建线程,滑动关闭
                            @Override
                            public void run() {
                                for (int i = 0;; i++) {
                                    try {
                                        Thread.sleep(10);// rightView每隔10ms右移3,保证滑动流畅
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }
                                    int len = (int) (X + 3 * i);
                                    // System.out.println("len:" + len);
                                    Message message = new Message();// android中非UI线程不允许直接操作控件,可以将消息发送至主线程的handler类
                                    if (len >= rightView.getMeasuredWidth()) {
                                        message.what = 1;
                                        handler.sendMessage(message);// 发送消息
                                                                        // 关闭View
                                        break;
                                    } else {
                                        message.what = 0; // 发送消息 自动滑动
                                        handler.sendMessage(message);
                                    }
                                }
                            }
                        }).start();
            } else {
                scrollTo((int) -X, 0);
                // 计算透明度信息
                float alpha = (float) (1.0 - (float) (1.0 / 400) * X);
                // System.out.println("alpha:" + al);
                // 设置透明度
                leftView.setAlpha(alpha);
            }
            break;
        }
        // 设置true,消费event事件,不在向外传递
        return true;
    }

    @SuppressLint("HandlerLeak")
    Handler handler = new Handler() {
        @SuppressLint("NewApi")
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0) {
                scrollBy(-3, 0);// viewgroup向右滑动3
            } else if (msg.what == 1) {
                Toast.makeText(getContext(), "关闭", 50).show();
                setVisibility(View.GONE);// 设置viewgroup不可见(隐藏)
            }
        }

    };
}

使用:


<com.example.checkboxtest.MyView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <View
            android:id="@+id/rightview"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#ff0000" />
    </com.example.checkboxtest.MyView>

要显示底下的activity界面需要使用Fragment的add方法


//新建一个Fragment
Fragment bFragment = new BFragment();
getFragmentManager().beginTransaction().add(R.id.fragment, bFragment).commit();

昵    称:
验证码:

相关文档:

  • 自定义PreferenceActivity和PreferenceFragment的样式
    感谢:http://blog.csdn.net/luck_apple/article/details/7064004 这篇文章讲的是如何定义fragment的样式,基本布局都是从源码中弄过来的。通过设置布...
  • Android静默安装
    最近做了一个Android项目,要求软件能够自动下载指定的APK文件并自动安装,无须用户操作,即静默安装。在查阅了GOOGLE之后,综合了各...
  • Android中onInterceptTouchEvent与onTouchEvent
    onInterceptTouchEvent: onInterceptTouchEvent是在ViewGroup里面定义的。Android中的layout布局类一般都是继承此类的。onInterceptTouchEvent是用于拦截手势事...
  • [转]Android开发,实现可多选的图片ListView,便于批量操作
    本文转自:http://www.cnblogs.com/gergulo/archive/2011/06/14/2080629.html 之前项目需要实现一个可多选的图片列表,用户选中一到多张图片后,批量...
  • Java面试培训班
    ioffers竭诚为您提供面试服务,让您获得满意offer授课内容第1章android消息机制本节大纲深入理解android的消息机制handlermessagelooper异步处理...
  • 滑出式菜单实现:android-menudrawer
    滑出式菜单实现,它允许用户在您的应用程序实现视图之间进行导航/切换。 该项目具有多种菜单展示效果,其中最常见的就是通过屏幕...
  • Gradle 初次使用
    心静志远|技术会被淘汰,但思想会一直永存(多思考,多总结,多分享) Gradle的简介,这里就不罗嗦了,Google上一大堆,这里就说说它...
  • android开发 打开各种系统设置信息页面
    Android软件时,常常需要打开系统设置或信息界面,来设置相关系统项或查看系统的相关信息,这时我们就可以使用以下语句来实现:(...
  • android中如何加入广告?
    一直想了解在android应用上增加广告,利用业余时间找了一个国内非常好用的广告平台“万普世纪”(你可以点击了解),做了个小...
  • android调试之adb
    ...
  • android 多渠道打包
    android应用上传时,需要区分开每个渠道。一般都会在配置文件中更改一个渠道id,如果有多个渠道,手动修改并生成apk的话会非常麻烦,...
  • 使用 Intel HAXM 为 Android 模拟器加速,媲美真机
    使用IntelHAXM为Android模拟器加速,媲美真机 Android模拟器一直以运行速度慢著称,本文介绍使用IntelHAXM技术为Android模拟器加速,使模拟器...
  • android的简单入门学习
    话说光配环境就整死我了,不是说多么难,是最近google被屏了,很多sdk里面需要下载的东西都下不下来,坑爹啊。最后跟扫拉稀要了一个...
  • android xml布局文件中tools:layout的作用
    摘要用最新版本的adt创建一个基于master/detailflow模版的app的时候,生成的activity_item_list.xml文件中有一个tools:layout属性:fragmentxmlns:android="h...
  • Android 圆角的 ListView
    圆角ListView效果如下: 实现圆角的ListView需要重写ListView控件,代码如下: 1publicclassRoundedRectListViewextendsListView{2//设置圆角的值3privatest...
  • Intent打开系统设置界面(action列表)
    Android软件时,常常需要打开系统设置或信息界面,来设置相关系统项或查看系统的相关信息,这时我们就可以使用以下语句来实现:(...
  • Android游戏开发之单点触摸与多点触摸的响应方式
    From:http://blog.csdn.net/xys289187120/article/details/6686708 游戏开发中的触摸事件...
  • (转)android src/android sdk 的目录结构
    最近看了几眼android的javaAPI(4.0版本),稍微整理了一下,由于本人现在并未从事android开发,有不对的地方还请各位牛人指正一下。一、...
  • Android百度地图之离线下载功能
    百度SDK中提供了离线下载功能,这样在有网络的时候可以把地图下载下来,那么以后在无网的时候就可以使用地图功能了...
  • Android杂谈--HTC等手机接收不到UDP广播报文的解决方案
    最近遇到个问题,在android手机上发送UDP报文的时候,HTC等机型(测试用HTCnewone)接收不到广播报文,而其他的samsung,huawei,xiaomi,nexus等等均没...