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

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影