android开发教程之实现滑动关闭fragment示例
发布时间:2023-09-18 11:37:56
主要代码:(有注释)
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();


猜你喜欢
- 工厂模式工厂模式顾名思义就是生产实例的工厂,使用工厂模式不会在程序中使用new关键字创建实例。而是将创建对象的细节隐藏,对外提供统一的方法,
- Struts2 Action/动作动作是Struts2框架的核心,因为他们的任何MVC(模型 - 视图 - 控制器)框架。每个URL将被映射
- 传统“长轮询”实现Web端即时通讯的问题WebSocket出现之前,Web端为了实现即时通讯,所用的技术都是Ajax轮询(polling)。
- 一、 测试代码:二、添加参数1、在终端工具中①先编译: javac Test.java②再运行: java Test args1 args2
- 一>实现功能在实验二中我们已经实现了在类微信界面添加recyclview并添加相应的imageview,本次实验就是在recyclvi
- 在实际项目当中,我们经常会涉及到对时间的处理,例如登陆网站,我们会看到网站首页显示XXX,欢迎您!今天是XXXX年。。。。某些网站会记录下用
- 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码。反射就是把Java类中的各个成员映射成一个个的Java对象。即在运行状态中,对于
- 本文实例讲述了spring AOP的Around增强实现方法。分享给大家供大家参考,具体如下:一 配置<?xml version=&q
- 在Java项目开发中,Maven是非常重要的构建工具之一,它可以帮助我们管理项目的依赖、构建和发布。本文将通过以下两个方面来介绍Maven打
- 目录一对一关联保存:留言表实体类配置:(主表)留言内容表配置:(从表)留言表hbm.xml配置:(主表)留言内容表hbm.xml配置:(从表
- 前提概要:上一篇文章已经介绍过了RecyclerView的基本使用方法,原文如下:android RecyclerView布局真的只是那么简
- 本文实例为大家分享了Unity3d简易五子棋源码,供大家参考,具体内容如下Unity3d部分对C#源码进行了改写简化:using Unity
- 简介Arthas 是Alibaba开源的Java诊断工具,动态跟踪Java代码;实时监控JVM状态,可以在不中断程序执行的情况下轻松完成JV
- 市面上有好多的类比ListView刷新数据的开源框架,如:v4包自带的SwipeRefreshLayout ,以及集ListView、Gri
- C#过滤DataTable中的空数据和重复数据string sql = "select name,age from user&qu
- ExpandableListView介绍 ExpandableListView的引入 ExpandableListVie
- 属性(Attribute)是C#程序设计中非常重要的一个技术,应用范围广泛,用法灵活多变。本文就以实例形式分析了C#中属性的应用。具体入戏:
- Java多线程下载网图案例此案例依赖——文件操作工具类(FileUtils)使用 apache 的commons-io包下的FileUtil
- 给TextureView添加边框(专业名词为描边),有三种解决方案:1.设置一个9 patch 的,右边框,中间是空的PNG。2.自定义一个
- 最近滑动验证码在很多网站逐步流行起来,一方面对用户体验来说,比较新颖,操作简单,另一方面相对图形验证码来说,安全性并没有很大的降低。当然到目