Android:继承ScrollView实现自定义向上滚动弹出框(背景半透明)
来源:互联网 发布:辽宁体育频道哪个软件 编辑:程序博客网 时间:2024/05/01 14:05
现在常见的效果:点击按钮向上弹出框展示信息,弹出后背景变为半透明,并且支持手势滑动关闭弹出框。
效果图如下:
下面上代码:
1、核心类:自定义向上弹出框 VerticalScrollView.java
package app.popupbox.view;import android.app.Activity;import android.content.Context;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.view.WindowManager;import android.view.animation.Animation;import android.view.animation.Animation.AnimationListener;import android.view.animation.TranslateAnimation;import android.widget.ScrollView;public class VerticalScrollView extends ScrollView {/** 屏幕高度 */private int mScreenHeight;private boolean isOpen = false;private boolean isFirst = true;private boolean mIsContinue = true;private View mVwBackground;private ViewGroup mViewGroup;private ViewGroup mVwContent;private int mAnimationTime = 400;private int mAlph = 1;private int mMaxAlph = 70;public VerticalScrollView(Context context) {super(context);}public VerticalScrollView(Context context, AttributeSet attrs) {super(context, attrs);}public VerticalScrollView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}/* * (non-Javadoc) * * @see android.widget.ScrollView#onMeasure(int, int) */@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {if (isFirst) {mViewGroup = (ViewGroup) getChildAt(0);mVwBackground = mViewGroup.getChildAt(0);mVwContent = (ViewGroup) mViewGroup.getChildAt(1);mScreenHeight = getScreemH();mVwBackground.getLayoutParams().height = mScreenHeight;mVwContent.getLayoutParams().height = mVwContent.getLayoutParams().height;setVisible(false);isFirst = false;}super.onMeasure(widthMeasureSpec, heightMeasureSpec);}/* * (non-Javadoc) * * @see android.widget.ScrollView#onLayout(boolean, int, int, int, int) */@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {// TODO Auto-generated method stubsuper.onLayout(changed, l, t, r, b);if (changed) {this.smoothScrollTo(0, mScreenHeight);}}@Overridepublic boolean onTouchEvent(MotionEvent ev) {int action = ev.getAction();switch (action) {case MotionEvent.ACTION_UP:int i = getScrollY();// 如果滑动距离大于屏幕的2/3,则弹出,这里可自定义if (i > mScreenHeight * 2 / 3) {smoothScrollTo(0, mScreenHeight);isOpen = true;} else {traslateY(0, mScreenHeight);isOpen = false;}return true;}return super.onTouchEvent(ev);}/** * 关闭 * * @description * @date 2014-12-5 */public void closeContent() {if (isOpen) {traslateY(0, mScreenHeight);isOpen = false;}}/** * 打开 * * @description * @date 2014-12-5 */public void openContent() {if (!isOpen) {setVisible(true);traslateY(mScreenHeight, 0);isOpen = true;}}/** * 实现滑动动画 * * @description * @date 2014-12-5 * @param oldt * @param t */public void traslateY(int oldt, int t) {TranslateAnimation animation = new TranslateAnimation(0, 0, oldt, t);animation.setDuration(mAnimationTime);animation.setFillAfter(true);mVwContent.startAnimation(animation);animation.setAnimationListener(new AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {// TODO Auto-generated method stubmIsContinue = true;if (isOpen) {mAlph = 1;}new Thread(mRunnable).start();}@Overridepublic void onAnimationRepeat(Animation animation) {// TODO Auto-generated method stub}@Overridepublic void onAnimationEnd(Animation animation) {// 滑动结束如果满足关闭条件if (!isOpen) {setVisible(false);scrollTo(0, mScreenHeight);}if (!isOpen) {mViewGroup.setBackgroundColor(Color.TRANSPARENT);}}});}Runnable mRunnable = new Runnable() {@Overridepublic void run() {while (mIsContinue) {try {Thread.sleep(mAnimationTime / mMaxAlph);if (isOpen) {mAlph++;if (mAlph <= mMaxAlph) {mHandler.sendEmptyMessage(0);} else {mIsContinue = false;}} else {mAlph--;if (mAlph >= 1) {mHandler.sendEmptyMessage(0);} else {mIsContinue = false;}}} catch (InterruptedException e) {e.printStackTrace();}}}};Handler mHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case 0:mViewGroup.setBackgroundColor(Color.argb(mAlph, 0, 0, 0));break;}};};/** * 调用该方法操作该弹出框 * * @description * @date 2014-12-5 */public void toggle() {if (isOpen) {closeContent();} else {openContent();}}/** 弹出框是否弹出 */public boolean isOpen() {return isOpen;}/** * * @description * @date 2014-12-5 * @param visible */public void setVisible(boolean visible) {if (visible) {mViewGroup.setVisibility(VISIBLE);this.setVisibility(VISIBLE);} else {mViewGroup.setVisibility(GONE);this.setVisibility(GONE);}}/** * 获得屏幕高度 * * @return int */@SuppressWarnings("deprecation")private int getScreemH() {WindowManager wm = ((Activity) getContext()).getWindowManager();return wm.getDefaultDisplay().getHeight();}}
2、主布局:layout_pop_up_box_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/btn" android:layout_width="match_parent" android:layout_height="50dp" android:layout_alignParentBottom="true" android:text="点击弹出" /> <app.popupbox.view.VerticalScrollView android:id="@+id/verticalScrollView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@id/btn" android:layout_alignParentBottom="true" android:layout_marginBottom="50dp" android:scrollbars="none" > <LinearLayout android:id="@+id/dialog_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#66000000" android:orientation="vertical" > <View android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#00000000" /> <include layout="@layout/dialog_view" /> </LinearLayout> </app.popupbox.view.VerticalScrollView></RelativeLayout>
3、弹出框中布局:dialog_view.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="300dp" android:background="@android:color/holo_blue_dark" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="弹出框" /></RelativeLayout>
package app.popupbox;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.widget.Button;import app.popupbox.view.VerticalScrollView;public class PopUpBoxMainActivity extends Activity { private VerticalScrollView mVerticalScrollView; private Button mButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.layout_pop_up_box_main); initView(); } /** * 初始化控件 */ private void initView() { mVerticalScrollView = (VerticalScrollView) findViewById(R.id.verticalScrollView); mButton = (Button) findViewById(R.id.btn); mButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mVerticalScrollView.toggle(); updateView(); } }); } /** * 更新界面 */ private void updateView() { if (mVerticalScrollView.isOpen()) { mButton.setText("点击关闭"); } else { mButton.setText("点击弹出"); } }}
5、工程结构
1 0
- Android:继承ScrollView实现自定义向上滚动弹出框(背景半透明)
- Android Alertdialog弹出框设置半透明背景
- Android 实现背景半透明
- Android绑定EditText自动弹出自定义软键盘不同按键设置不同背景的实现(自动向上顶适应布局)
- Android实现底部半透明弹出框PopUpWindow
- 实现popupwindow弹出后背景办成半透明
- 软键盘弹出,scrollview或listview向上滚动
- Activity从底部向上半透明弹出效果实现
- Android弹出popupWindow 背景变暗(背景半透明)(两种写法)
- android自定义dialog弹出框、透明背景
- Android 自定义ScrollView 实现滚动时切换标题内容
- Android ScrollView向上滑动控件顶部弹出悬浮框并且淡入淡出
- android之自定义viewGroup仿scrollView的两种实现(滚动跟粘性)
- Android 创建自定义对话框主题(使用半透明背景也不会露出原有的背景了)
- 如何使用纯js实现一个带有灰色半透明背景的弹出框
- ScrollView向上滚动显示头部
- android中popupwindow弹出后,屏幕背景变成半透明
- android中popupwindow弹出后,屏幕背景变成半透明
- 处理java非正常的线程终止
- setCellTest
- 14、Longest Common Prefix
- Struts2中过滤器和拦截器的区别
- 用Lambda或者Linq语法对结果进行Group by并输出
- Android:继承ScrollView实现自定义向上滚动弹出框(背景半透明)
- 构造与析构 && static 问题
- winForm +access 数据连接 出错 未在本地计算机上注册“Microsoft.Jet.OLEDB.12.0”
- 学密码学一定得学程序 KMP
- Zookeeper的灵魂---Paxos
- MIME Type
- SQL Server 中WITH (NOLOCK)浅析
- New Blog after joining a new company!
- 线下支付的流程