700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Android评论工具类 实现QQ空间文字评论效果

Android评论工具类 实现QQ空间文字评论效果

时间:2020-08-09 18:01:07

相关推荐

Android评论工具类 实现QQ空间文字评论效果

方便使用的评论工具类,而且能监听到小键盘消失事件,能返回小键盘的高度,追踪评论位置。

只是评论功能,木有表情等其他的东东(表情目前都用VP+GV写的,正在尝试使用一个VIew来做分页)

具体文件中有注释,效果看下qq空间的评论就好。

工具使用方式

//第一种姿势@Overridepublic void onItemClick(AdapterView<?> parent, final View view, int posi, long id) {talkPopWindow = new TalkPopWindow(activity, new TalkPopWindow.OnSendMessage() {@Overridepublic void onSendMessage(String msg) {//发送消息哦}@Overridepublic void onRefreshlayout(int variation,int containerHeight) {//在这里获得小键盘活动的高度之后,计算控件需要滑动的距离talkPopWindow.calculateExternalOffset(dongtai_lv,view,variation,0);}}, 1);talkPopWindow.pop();}//第二种姿势View.OnClickListener onClickListener = new View.OnClickListener() {@Overridepublic void onClick(final View v) {// if(talkPopWindow == null){talkPopWindow = new TalkPopWindow(activity, new TalkPopWindow.OnSendMessage() {@Overridepublic void onSendMessage(String msg) {//发送你的消息}@Overridepublic void onRefreshlayout(int variation,int containerHeight) {//在这里获得小键盘活动的高度之后,计算控件需要滑动的距离//因为这里不是在onItemClick中,所以要拿到现在的item布局,需要按照层次获取父布局:我这里是两层//当然你也可以使用别的方法,这里只是需要拿到item来计算高度talkPopWindow.calculateExternalOffset(dongtai_lv,(View)(v.getParent().getParent()),variation,0);}}, 1);talkPopWindow.pop();}

工具类代码:

package com.zhrt.dp.duanpian.liver_plugin.danmu;import android.app.Activity;import android.content.Context;import android.graphics.drawable.BitmapDrawable;import android.os.Handler;import android.os.Message;import android.view.Gravity;import android.view.View;import android.view.ViewTreeObserver;import android.view.WindowManager;import android.view.inputmethod.InputMethodManager;import android.widget.Button;import android.widget.EditText;import android.widget.ListView;import android.widget.PopupWindow;import com.zhrt.dp.duanpian.R;/*** 用来显示聊天的布局,同时防止小键盘弹出导致播放内容高度的改变* 为了保证每次都能正确监听小键盘的弹出与消失。pop不能复用,每次都要new哦* Created by Eleven on /9/21.*/public class TalkPopWindow {public TalkPopWindow(Activity activity, OnSendMessage onSendMessage){this.activity = activity;this.onSendMessage = onSendMessage;}/*** 因为使用场景不同,所以这里可以用style标志来选取不同的布局,客官当然可以传id* @param activity* @param onSendMessage* @param style*/public TalkPopWindow(Activity activity, OnSendMessage onSendMessage, int style){this.activity = activity;this.onSendMessage = onSendMessage;this.style = style;}//入参Activity activity;OnSendMessage onSendMessage;//业务引用EditText et;//通用输入器Button bt;//通用发送按钮PopupWindow pw;//popWindow 当然也可以换成dialog,popwindow:不会引起视频的暂停等,但是没有复制粘贴功能;dialog:会引起视频的暂停,但是可以调起系统的复制粘贴功能int style = 0;//输入部分样式//View//兼容其他用途,设置syleView view = null;//popViewView tempView = null;//输入View的布局//逻辑属性int containerHeight = 0;//tempView的高度:int height = 0;//布局的高度boolean toShow = false;//是不是第一次尝试显示,与显示机制有关int[] location = new int[2];/*** 显示pop*/public void pop(){dimiss();toShow = true;view = activity.getLayoutInflater().inflate(R.layout.pop_layout,null);pw = new PopupWindow(view, WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.MATCH_PARENT);if(style == 0){//区分styleet = (EditText) view.findViewById(R.id.et_danmuEdit);bt = (Button) view.findViewById(R.id.bt_sendDanmu);view.findViewById(R.id.danmutLinear).setVisibility(View.VISIBLE);view.findViewById(mentLinear).setVisibility(View.GONE);tempView = view.findViewById(R.id.danmutLinear);}else{et = (EditText) view.findViewById(mentEdit);bt = (Button) view.findViewById(mentButton);view.findViewById(R.id.danmutLinear).setVisibility(View.GONE);view.findViewById(mentLinear).setVisibility(View.VISIBLE);tempView = view.findViewById(mentLinear);}tempView.measure(0,0);containerHeight = tempView.getMeasuredHeight();//计算输入布局的高度。//监听布局的变化view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {et.getLocationOnScreen(location);if(height == 0 && location[1] >0 ){height = location[1];}int diff = height - location[1];if(toShow && diff == 0){return;}toShow = false;if(diff > 0){onSendMessage.onRefreshlayout(diff,containerHeight);}else{pw.dismiss();}}});view.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {pw.dismiss();}});et.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {showSoftKeyboard(et,activity);}});bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if(et.getText().toString().trim().length() > 0) {onSendMessage.onSendMessage(et.getText().toString().trim());}et.setText("");}});et.requestFocus();et.setFocusable(true);et.requestFocus();//获取焦点,光标出现showSoftKeyboard(et,activity);pw.setBackgroundDrawable(new BitmapDrawable());pw.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);pw.setFocusable(true);pw.setTouchable(true);pw.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);pw.showAsDropDown(new View(activity), Gravity.BOTTOM, 0, 0);pw.setOnDismissListener(new PopupWindow.OnDismissListener() {@Overridepublic void onDismiss() {onSendMessage.onRefreshlayout(0,containerHeight);//万一某些机型小键盘自己关不掉,这里手动关掉即可 et调起的}});handler.sendEmptyMessageDelayed(1,200);//延迟再调一下小键盘,有的机型自己起不来}public static void showSoftKeyboard(EditText editText, Context context) {if (editText != null && context != null) {InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);imm.showSoftInput(editText, 0);}}private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {switch (msg.what){case 1:et.setFocusable(true);et.requestFocus();//获取焦点,光标出现showSoftKeyboard(et,activity);break;}}};/*** 用于计算需要便宜的高度*/ListView listView;int screenHeight = 0;int[] a = new int[2];View ItemView;int softInputHeight = 0;int changeHeight = 0;int itemHeight = 0;/*** 定位* @param scrollView 整体的滑动view //这里可以换成别的View 一些View没有smooth方法。客官可以自己换* @param ItemView需要定位的View,可以是itemView内部view* @param softInputHeight 小键盘高度* @param etrOffset 额外偏移高度。看你心情喽*/public void calculateExternalOffset(ListView scrollView, View ItemView, int softInputHeight, int etrOffset) {if (softInputHeight == 0) {return;}listView = scrollView;this.ItemView = ItemView;this.softInputHeight = softInputHeight;screenHeight = AppUtils.getScreenDispaly(activity)[1];ItemView.getLocationOnScreen(a);itemHeight = a[1]+ItemView.getHeight();changeHeight = softInputHeight + containerHeight;scrollView.smoothScrollBy(itemHeight + changeHeight - screenHeight,100);}/*** 也可以使用scrollto,这样就不用算时间了。距离过长,时间太短,有可能滑动不彻底* @param distance* @return*/public int suggestDuration(int distance){distance = Math.abs(distance);if(distance<300){return 100;}if(distance<1200){return 500;}if(distance>2000){return 800;}return 1000;}public void dimiss(){if(pw != null && pw.isShowing()){pw.dismiss();}}public interface OnSendMessage{/*** 发消息* @param msg*/void onSendMessage(String msg);/*** 小键盘顶起后引起的高度变化* @param variation 小键盘的高度* @param containerHeight 输入框的高度请根据个人口味加料*/void onRefreshlayout(int variation,int containerHeight);}}

资源地址:/detail/kumuip/9706913

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。