首页 > 编程知识 正文

安卓仿微信朋友圈图片查看效果,有没有发朋友圈定位的软件

时间:2023-05-04 16:24:55 阅读:173151 作者:4540

文章:模仿微信朋友圈,单击注释可自动转到相关行

一、想法:

1、点击【注释】控件时出现dialog。 dialog上面是ScrollView,下面是输入框。 实现在键盘出现时上推输入框的效果。

计算接收视图应滑动的距离

3 .拦截键盘的显示和隐藏,隐藏时诊断;

在写作的过程中做了一些修改:

1 .在列表的【注释】控件中设置单击事件的回调时,将整个itemView作为参数传递给回调方法,我觉得会稍微易懂一点。 另外,在【注释】控件中设定margin的情况下也可以直接覆盖。 也就是说,输入框的顶部与列表对应的item的底部对齐。

2 .点击Dialog中的scrollView,添加Dialog消失事件;

二.实现步骤及代码片段

1 .查看【备注】并点击事件代码,不用说查看列表:

//注释按钮事件item view.findviewbyid (r.id.TV _ comment ).setonclicklistener ) newview.onclicklistener ) @ overridide 没有使用定位。((mainactivity ) mContext ).showinputdialog (item view,getAdapterPosition ) ) ) ) 652 ); ); showInputDialog方法在主activity中如下所示:

/**显示注释dialog * * @ paramitemview * @ param position */publicvoidshowinputdialog (viewitem view, int position ) finalinndialog )输入//item底部的y坐标dialog=newdialog(this,Android.r.style.theme _ translucent _ no ) view view=layoutinflater.from (this ).inflate ) r.layout.dialog_input,null ); dialog.setcontentview(view; 单击//scrollView事件,然后单击dialog dismiss, onClick拦截无效dialog.findviewbyid (r.id.scroll view ).setontouchlistener ) new view.ontouchlistener @ overridepublister 返回真; }; ); dialog.show (; item view.post delayed (new runnable () { @Override public void run ) (linearlayoutllcommentinput=dialog.findviewbyid ) ) log.I(display ),' itembottomy=' itembottomy ' input text y=' y ); 要滑动RecyclerView,请将RV_content.smoothscrollby(0,itemBottomY - y )与项目下方和输入框上方对齐; (,300 ); }如何获取画面上控件左上顶点的y坐标

/** *控件左上顶点的y坐标* * @ param view * @ return */privateintgetcoordinatey (view ) int[]coordinate=newint )2); view.getLocatio

nOnScreen(coordinate); return coordinate[1]; }

2.监听键盘的显示和隐藏做相关操作

有两种方法:
(1)

getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { handleWindowChange(); } });

(2)

getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { handleWindowChange(); } });

对应的 handleWindowChange() 方法:

/** * 监听键盘的显示和隐藏 */ private void handleWindowChange() { Rect rect = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);//获取当前界面显示范围 Log.i("display ", "top = " + rect.top); Log.i("display ", "bottom = " + rect.bottom); int displayHeight = rect.bottom - rect.top;//app内容显示高度,即屏幕高度-状态栏高度-键盘高度 int totalHeight = getWindow().getDecorView().getHeight(); //显示内容的高度和屏幕高度比大于 0.8 时,dismiss dialog if ((float) displayHeight / totalHeight > 0.8)//0.8只是一个大致的比例,可以修改 if (null != dialog && dialog.isShowing()) dialog.dismiss(); }

3.点击最后一项 item 的时候特殊处理:
原本键盘弹出时,会自动把 recyclerview 往上顶(当然,这跟当前 activity 设置的 windowSoftInputMode 有关),但是,现在键盘弹出时上面多了一个输入的布局,会导致在点击最后一个 item 的时候被遮挡一部分,所以,最后一个 item 点击时要做特殊处理,即给 recyclerView 添加一个和输入布局等高的 item。方法如下:

输入框弹出时候的处理:

/** * 显示评论输入 dialog * * @param itemView * @param position */ public void showInputDialog(View itemView, final int position) { final int itemBottomY = getCoordinateY(itemView) + itemView.getHeight();//item 底部y坐标 dialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar); View view = LayoutInflater.from(this).inflate(R.layout.dialog_input, null); dialog.setContentView(view); //scrollView 点击事件,点击时将 dialog dismiss,设置 onClick 监听无效 dialog.findViewById(R.id.scrollView).setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) dialog.dismiss(); return true; } }); dialog.show(); itemView.postDelayed(new Runnable() { @Override public void run() { LinearLayout llCommentInput = dialog.findViewById(R.id.ll_comment_input); int y = getCoordinateY(llCommentInput); Log.i("display", "itemBottomY = " + itemBottomY + " input text y = " + y); //最后一个 item 特殊处理,添加一个和输入框等高的 item,使 RecyclerView 有足够的空间滑动 if (position == adapter.data.size() - 1) { adapter.data.add(new BottomBean()); adapter.bottomHeight = llCommentInput.getHeight(); adapter.notifyDataSetChanged(); } //滑动 RecyclerView,是对应 item 底部和输入框顶部对齐 rv_content.smoothScrollBy(0, itemBottomY - y); } }, 300); }

隐藏输入框时的处理:

/** * 监听键盘的显示和隐藏 */ private void handleWindowChange() { Rect rect = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);//获取当前界面显示范围 Log.i("display ", "top = " + rect.top); Log.i("display ", "bottom = " + rect.bottom); int displayHeight = rect.bottom - rect.top;//app内容显示高度,即屏幕高度-状态栏高度-键盘高度 int totalHeight = getWindow().getDecorView().getHeight(); //显示内容的高度和屏幕高度比大于 0.8 时,dismiss dialog if ((float) displayHeight / totalHeight > 0.8)//0.8只是一个大致的比例,可以修改 if (null != dialog && dialog.isShowing()) { dialog.dismiss(); //如果添加了空白 item ,移除空白 item if (adapter.data.get(adapter.data.size() - 1) instanceof BottomBean) { adapter.data.remove(adapter.data.size() - 1); adapter.notifyDataSetChanged(); } } }

GitHub 地址:https://github.com/YINQIEIE/weixinCommnetDemo

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。