Android开发空间靠右放代码,Android开发仿QQ空间根据位置弹出PopupWindow显示更多操作效果...

本文主要是介绍Android开发空间靠右放代码,Android开发仿QQ空间根据位置弹出PopupWindow显示更多操作效果...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们打开QQ空间的时候有个箭头按钮点击之后弹出PopupWindow会根据位置的变化显示在箭头的上方还是下方,比普通的PopupWindow弹在屏幕中间显示好看的多。

先看QQ空间效果图:

1fe809b6c49d62d2bc1fdb2f66fdb63c.pngedd63cf8f14bcd0bea4b1205695767a0.png

e0a1b0830d098a6fe441363bbc485914.png

这个要实现这个效果可以分几步进行

1.第一步自定义PopupWindow,实现如图的样式,这个继承PopupWindow自定义布局很容易实现

2.得到点击按钮的位置,根据位置是否在屏幕的中间的上方还是下方,将PopupWindow显示在控件的上方或者下方

2897382d8bb72635f1403592b4ab5826.png

3.适配问题,因为PopupWindow上面的操作列表是动态的所以要自定义listView

4.动画效果+背景变暗

通过步骤分析,我们就很清晰的了解我们要做什么,话不多说,从第一步开始吧

下面自定义PopupWindow实现效果

1.重写listView,重新计算高度(一般也应用于解决ScrollView嵌套listView只显示一行的问题)

public class MyListView extends ListView {

public MyListView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public MyListView(Context context) {

super(context);

}

public MyListView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

@Override

public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,

MeasureSpec.AT_MOST));

}

}

2.自定义PopupWindow的布局文件

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

android:gravity="right">

android:id="@+id/arrow_up"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginRight="28dp"

android:src="@drawable/arrow_up_white"

android:visibility="visible"/>

android:id="@+id/lv_list"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:padding="@dimen/normal_margin8"

android:layout_marginTop="-1dp"

android:layout_marginBottom="-1dp"

android:dividerHeight="0dp"

android:layout_marginLeft="@dimen/normal_margin8"

android:layout_marginRight="@dimen/normal_margin8"

android:scrollbars="none"

android:background="@drawable/custom_white"

android:divider="@null">

android:id="@+id/arrow_down"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginRight="28dp"

android:src="@drawable/arrow_down_white"

android:visibility="visible"/>

2.PopupWindow弹出动画以及消失动画

popshow_operation_anim_down.xml

android:fromXScale="0.0"

android:toXScale="1.0"

android:fromYScale="0.0"

android:toYScale="1.0"

android:pivotX="90%"

android:pivotY="0%"

android:fillAfter="false"

android:duration="300" >

popshow_operation_anim_up.xml

android:fromXScale="0.0"

android:toXScale="1.0"

android:fromYScale="0.0"

android:toYScale="1.0"

android:pivotX="90%"

android:pivotY="100%"

android:fillAfter="false"

android:duration="250" >

消失动画是渐隐动画可以自己定义,同理。

3.重写PopupWindow了

public class CustomOperationPopWindow extends PopupWindow {

private Context context;

private View conentView;

private View backgroundView;

private Animation anim_backgroundView;

private MyListView listView;

private TypeSelectPopuAdapter selectAdapter;

ImageView arrow_up, arrow_down;

List typeSelectlist = new ArrayList<>();

int[] location = new int[2];

private OnItemListener onItemListener;

private AdapterView.OnItemClickListener onItemClickListener;

public interface OnItemListener {

public void OnItemListener(int position, TypeSelect typeSelect);

}

;

public void setOnItemMyListener(OnItemListener onItemListener) {

this.onItemListener = onItemListener;

}

public CustomOperationPopWindow(Context context) {

this.context = context;

initView();

}

public CustomOperationPopWindow(Context context, List typeSelectlist) {

this.context = context;

this.typeSelectlist = typeSelectlist;

initView();

}

private void initView() {

this.anim_backgroundView = AnimationUtils.loadAnimation(context, R.anim.alpha_show_anim);

LayoutInflater inflater = (LayoutInflater) context

.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

this.conentView = inflater.inflate(R.layout.view_operation_popupwindow, null);

// 设置SelectPicPopupWindow的View

this.setContentView(conentView);

// 设置SelectPicPopupWindow弹出窗体的宽

this.setWidth(LayoutParams.MATCH_PARENT);

// 设置SelectPicPopupWindow弹出窗体的高

this.setHeight(LayoutParams.WRAP_CONTENT);

// 设置SelectPicPopupWindow弹出窗体可点击

this.setFocusable(true);

this.setOutsideTouchable(true);

// 刷新状态

this.update();

// 实例化一个ColorDrawable颜色为半透明

ColorDrawable dw = new ColorDrawable(0000000000);

// 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,设置其他控件变化等操作

this.setBackgroundDrawable(dw);

// 设置SelectPicPopupWindow弹出窗体动画效果

this.setAnimationStyle(R.style.operation_popwindow_anim_style_up);

this.listView = (MyListView) conentView.findViewById(R.id.lv_list);

this.arrow_up = (ImageView) conentView.findViewById(R.id.arrow_up);

this.arrow_down = (ImageView) conentView.findViewById(R.id.arrow_down);

//设置适配器

this.selectAdapter = new TypeSelectPopuAdapter(context, typeSelectlist,

R.layout.item_operation_popu);

this.listView.setAdapter(selectAdapter);

this.listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView> parent, View view, int position, long id) {

if (isShowing()) {

dismiss();

}

onItemListener.OnItemListener(position, typeSelectlist.get(position));

}

});

this.setOnDismissListener(new OnDismissListener() {

@Override

public void onDismiss() {

if (backgroundView != null) {

backgroundView.setVisibility(View.GONE);

}

}

});

}

//设置数据

public void setDataSource(List typeSelectlist) {

this.typeSelectlist = typeSelectlist;

this.selectAdapter.notifyDataSetChanged();

}

/**

* 没有半透明背景 显示popupWindow

*

* @param

*/

public void showPopupWindow(View v) {

v.getLocationOnScreen(location); //获取控件的位置坐标

//获取自身的长宽高

conentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);

if (location[1] > MainApplication.SCREEN_H / 2 + 100) { //MainApplication.SCREEN_H 为屏幕的高度,方法可以自己写

this.setAnimationStyle(R.style.operation_popwindow_anim_style_up);

arrow_up.setVisibility(View.GONE);

arrow_down.setVisibility(View.VISIBLE);

this.showAtLocation(v, Gravity.NO_GRAVITY, (location[0]), location[1] - conentView.getMeasuredHeight());

} else {

this.setAnimationStyle(R.style.operation_popwindow_anim_style_down);

arrow_up.setVisibility(View.VISIBLE);

arrow_down.setVisibility(View.GONE);

this.showAsDropDown(v, 0, 0);

}

}

/**

* 携带半透明背景 显示popupWindow

*

* @param

*/

public void showPopupWindow(View v, View backgroundView) {

this.backgroundView = backgroundView;

v.getLocationOnScreen(location); //获取控件的位置坐标

//获取自身的长宽高

conentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);

backgroundView.setVisibility(View.VISIBLE);

//对view执行动画

backgroundView.startAnimation(anim_backgroundView);

if (location[1] > MainApplication.SCREEN_H / 2 + 100) { //若是控件的y轴位置大于屏幕高度的一半,向上弹出

this.setAnimationStyle(R.style.operation_popwindow_anim_style_up);

arrow_up.setVisibility(View.GONE);

arrow_down.setVisibility(View.VISIBLE);

this.showAtLocation(v, Gravity.NO_GRAVITY, (location[0]), location[1] - conentView.getMeasuredHeight()); //显示指定控件的上方

} else {

this.setAnimationStyle(R.style.operation_popwindow_anim_style_down); //反之向下弹出

arrow_up.setVisibility(View.VISIBLE);

arrow_down.setVisibility(View.GONE);

this.showAsDropDown(v, 0, 0); //显示指定控件的下方

}

}

/**

* 显示popupWindow 根据特殊要求高度显示位置

*

* @param

*/

public void showPopupWindow(View v, View backgroundView,int hight) {

this.backgroundView = backgroundView;

v.getLocationOnScreen(location);

//获取自身的长宽高

conentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);

backgroundView.setVisibility(View.VISIBLE);

//对view执行动画

backgroundView.startAnimation(anim_backgroundView);

if (location[1] > MainApplication.SCREEN_H / 2 + 100) {

this.setAnimationStyle(R.style.operation_popwindow_anim_style_up);

arrow_up.setVisibility(View.GONE);

arrow_down.setVisibility(View.VISIBLE);

this.showAtLocation(v, Gravity.NO_GRAVITY, (location[0]), location[1] - conentView.getMeasuredHeight()-hight);

} else {

this.setAnimationStyle(R.style.operation_popwindow_anim_style_down);

arrow_up.setVisibility(View.VISIBLE);

arrow_down.setVisibility(View.GONE);

this.showAsDropDown(v, 0, 0);

}

}

}

4.代码中的用法

1.

CustomOperationPopWindow customOperationPopWindow = new CustomOperationPopWindow(this, operationTypeSelectlist);

customOperationPopWindow.setOnItemMyListener(new CustomOperationPopWindow.OnItemListener() {

@Override

public void OnItemListener(int position, TypeSelect typeSelect) {

//此处实现列表点击所要进行的操作

}

});

2.

textView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

customOperationPopWindow.showPopupWindow(textView);//可以传个半透明view v_background过去根据业务需要显示隐藏

}

});

5.最终实际效果

5ab436b0f9f9e287347d90408ffb4d59.png

e2a41a85684a143354fec62cf76b0cb6.png

以上代码为几乎主要全部代码,主要是PopupWindow的用法,思路清晰一步一步实现很简单。

以上所述是小编给大家介绍的Android开发仿QQ空间根据位置弹出PopupWindow显示更多操作效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

这篇关于Android开发空间靠右放代码,Android开发仿QQ空间根据位置弹出PopupWindow显示更多操作效果...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/263667

相关文章

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放