提交 ccc8b86d 作者: enjoy

聊天Ui的功能

上级 b8abd43f
......@@ -54,6 +54,9 @@ ext{
"auto_ui":"com.github.JessYanCoding:AndroidAutoSize:v1.2.1",
//圆图
"round_iv":"de.hdodenhof:circleimageview:3.1.0"
"round_iv":"de.hdodenhof:circleimageview:3.1.0",
//netty
"netty":"io.netty:netty-all:5.0.0.Alpha2"
]
}
\ No newline at end of file
......@@ -43,4 +43,6 @@ dependencies {
api(rootProject.ext.android.retrofit2)
api(rootProject.ext.android.retrofit2_gson)
api(rootProject.ext.android.netty)
}
\ No newline at end of file
package com.work.provide_net.net
package com.work.provide_net.http.net
import com.work.provide_data.WeatherData
import retrofit2.http.GET
......
package com.work.provide_net.net
package com.work.provide_net.http.net
import com.work.provide_data.WeatherData
......
package com.work.provide_net.net
package com.work.provide_net.http.net
import com.work.provide_data.WeatherData
import com.work.provide_net.util.GsonConverterFactory
import com.work.provide_net.http.util.GsonConverterFactory
import okhttp3.OkHttpClient
import retrofit2.Retrofit
//import retrofit2.converter.gson.GsonConverterFactory
......
......@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.work.provide_net.util;
package com.work.provide_net.http.util;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
......
......@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.work.provide_net.util;
package com.work.provide_net.http.util;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
......
......@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.work.provide_net.util;
package com.work.provide_net.http.util;
import com.google.gson.Gson;
import com.google.gson.JsonIOException;
......
package com.work.provide_tool.util
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.graphics.Rect
import android.util.DisplayMetrics
import android.view.View
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import android.widget.ImageView
import androidx.core.content.ContextCompat
import androidx.core.content.getSystemService
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import com.work.provide_tool.R
import com.work.provide_tool.app.IApp
import com.work.provide_tool.app.IApp.Companion.app
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
......@@ -27,6 +34,25 @@ fun getDrawIdentifier(idStr:String):Int{
return app.resources.getIdentifier(idStr,"mipmap", app.packageName)
}
fun addListener(l:(View)->Unit,vararg view:View){
view.forEach { view->
view.setOnClickListener(l)
}
}
var SHOW = 1
var HIDE = 2
fun showLayoutType(v:View,showTag:Int){
if(showTag == SHOW){
if(v.visibility != View.VISIBLE){
v.visibility = View.VISIBLE
}
}else{
if(v.visibility == View.VISIBLE){
v.visibility = View.GONE
}
}
}
//keep 数据在刷ui的
fun keepDataUpdateWithUi(lfo: LifecycleOwner,otherThread:suspend ()->Unit,uiOfThread:()->Unit = {}){
lfo.lifecycleScope.launch {
......@@ -149,3 +175,23 @@ fun sp2Px(context: Context, spValue: Float): Int {
return (spValue * fontScale + 0.5f).toInt()
}
//-----------------------------------------/屏宽高-----------------------------------------
//-----------------------------------------打开软键盘-----------------------------------------
fun showInputKey(editText: EditText){
editText.requestFocus()
var i:InputMethodManager = app.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
i.showSoftInput(editText, 0)
}
fun hideInputKey(editText:EditText){
var i:InputMethodManager = app.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
i.hideSoftInputFromWindow(editText.windowToken,0)
}
fun getInputKey(a:Activity): Boolean {
var r = Rect()
a.window.decorView.getWindowVisibleDisplayFrame(r)
var v = r.bottom
return getTotalPhoneWithHW(2)- v > 0
}
//-----------------------------------------/打开软键盘-----------------------------------------
\ No newline at end of file
package com.juling.work_onepage.ui
import android.content.Intent
import android.graphics.Rect
import android.os.Handler
import android.os.Looper
import android.util.Log
import android.view.KeyEvent
import android.view.View
import android.view.Window
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import com.juling.work_onepage.R
......@@ -23,6 +29,7 @@ class InterflowActivity:GeneralAgentActivity<InterflowViewModel,ActivityInterflo
private val iViewModel by lazy {
ViewModelProvider(this)[InterflowViewModel::class.java]
}
private var initRv = false
companion object{
fun start(friendEntity:FriendEntity?){
......@@ -75,9 +82,38 @@ class InterflowActivity:GeneralAgentActivity<InterflowViewModel,ActivityInterflo
}
override fun initData() {
iDataBinding.talkInputWidget.setTalkLayoutWithInputListen { value->
Handler(Looper.getMainLooper()).postDelayed({
rv2End()
},50)
}
}
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if(!initRv){
rv2End()
initRv = true
}
}
override fun initEvent() {
}
private fun rv2End(){
iDataBinding.recyclerView .scrollToPosition(interflowAdapter.itemCount-1)
}
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
if(keyCode == KeyEvent.KEYCODE_BACK){
var talkInputWidget = iDataBinding.talkInputWidget
if(!talkInputWidget.getFunTagWithInit()){
talkInputWidget.restoreKeyInput()
return true
}
}
return super.onKeyDown(keyCode, event)
}
}
\ No newline at end of file
package com.juling.work_onepage.util.widget
import android.app.Activity
import android.content.Context
import android.os.Handler
import android.os.Looper
import android.util.AttributeSet
import android.util.Log
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.View
import android.view.inputmethod.EditorInfo
import android.widget.EditText
import android.widget.ImageView
import android.widget.LinearLayout
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.juling.work_onepage.R
import com.work.provide_tool.util.HIDE
import com.work.provide_tool.util.SHOW
import com.work.provide_tool.util.ToastUtil
import com.work.provide_tool.util.addListener
import com.work.provide_tool.util.getInputKey
import com.work.provide_tool.util.hideInputKey
import com.work.provide_tool.util.showInputKey
import com.work.provide_tool.util.showLayoutType
class TalkInputWidget(context: Context?, attrs: AttributeSet?) :
LinearLayout(context, attrs) {
private lateinit var iv_feel: ImageView
private lateinit var iv_add: ImageView
private lateinit var rv:RecyclerView
private lateinit var layout_feel: View
private lateinit var rv_add:RecyclerView
private lateinit var layout_add:View
private var dataAdd:ArrayList<TalkTypeDataWithAdd> = ArrayList()
private var dataFel:ArrayList<TalkTypeDataWithFeel> = ArrayList()
private lateinit var et:EditText
private var handler = Handler(Looper.getMainLooper())
private lateinit var a:Activity
private var adjustTalkLayoutWithInput:((Int)->Unit)? = null
private var addInfoWordArr = arrayOf("图片","拍摄","文件","位置")
companion object{
var FUN_INIT = 0
var FUN_ADD = 1
var FUN_FEEL = 2
}
init {
LayoutInflater.from(context).inflate(R.layout.widget_talk_input
,this,true)
a = context as Activity
initAll()
}
private fun initAll(){
initV()
initEvent()
}
private fun initV(){
getView()
initRv()
initRvAdd()
}
private fun getView(){
rv = findViewById(R.id.rv)
iv_add = findViewById(R.id.iv_add)
iv_feel = findViewById(R.id.iv_feel)
et = findViewById(R.id.et)
layout_feel = findViewById(R.id.layout_feel)
rv_add = findViewById(R.id.rv_add)
layout_add = findViewById(R.id.layout_add)
}
private fun initRv(){
//TODO1
tt()
rv.run {
var unit = 3+1
layoutManager = GridLayoutManager(context,unit)
adapter = object:BaseQuickAdapter<TalkTypeDataWithFeel,BaseViewHolder>(R.layout.widget_talk_input_with_feel,dataFel){
override fun convert(holder: BaseViewHolder, item: TalkTypeDataWithFeel) {
holder.setText(R.id.tv,item.na)
}
}
// addItemDecoration(GridSpacingItemWithDecoration(0))
}
}
private fun initRvAdd(){
rv_add.run {
var unit = 3+1
layoutManager = GridLayoutManager(context,unit)
adapter = object:BaseQuickAdapter<TalkTypeDataWithAdd,BaseViewHolder>(R.layout.widget_talk_input_with_add,dataAdd){
override fun convert(holder: BaseViewHolder, item: TalkTypeDataWithAdd) {
holder.setText(R.id.tv,item.na)
}
}
}
}
private fun tt(){
for(i in addInfoWordArr.indices){
dataAdd.add(TalkTypeDataWithAdd(addInfoWordArr[i],1,1))
}
for (i in 0..5){
dataFel.add(TalkTypeDataWithFeel("hello",1,1))
}
}
private fun initEvent(){
et.setOnEditorActionListener{tv,id,keyEvent->
// if(id == EditorInfo.IME_ACTION_DONE){
// true
//
// }else{
//
// }
false
}
et.setOnFocusChangeListener{v,have->
if(have){
showOnlyKey()
}
}
addListener({v->
when(v.id){
R.id.iv_add -> handlerAddIv()
R.id.iv_feel -> handlerFeelIv()
}
},iv_add,iv_feel)
}
private fun handlerAddIv(){
var value = et.text.toString()
if(value.length > 0){
ToastUtil.show(value)
return
}
et.clearFocus()
if(layout_add.visibility != View.VISIBLE){
showLayoutType(layout_add, SHOW)
showLayoutType(layout_feel, HIDE)
if(getInputKey(a)){
hideInputKey(et)
}
}else{
showLayoutType(layout_add, HIDE)
showInputKey(et)
}
adjustTalkLayoutWithInput?.invoke(0)
}
private fun handlerFeelIv(){
et.clearFocus()
if(layout_feel.visibility != View.VISIBLE){
showLayoutType(layout_feel, SHOW)
showLayoutType(layout_add, HIDE)
if(getInputKey(a)){
hideInputKey(et)
}
}else{
showLayoutType(layout_feel, HIDE)
showInputKey(et)
}
adjustTalkLayoutWithInput?.invoke(0)
}
fun restoreKeyInput(){
showLayoutType(layout_feel, HIDE)
showLayoutType(layout_add, HIDE)
if(getInputKey(a)){
hideInputKey(et)
}
adjustTalkLayoutWithInput?.invoke(0)
}
private fun showOnlyKey(){
showLayoutType(layout_feel, HIDE)
showLayoutType(layout_add, HIDE)
if(!getInputKey(a)){
showInputKey(et)
}
adjustTalkLayoutWithInput?.invoke(0)
}
fun getFunTagWithInit(): Boolean {
return layout_feel.visibility != View.VISIBLE
&& layout_add.visibility != View.VISIBLE
&& !getInputKey(a)
}
//调整聊天记录Ui
fun setTalkLayoutWithInputListen(adjustTalkLayoutWithInput:(Int)->Unit = {}){
this.adjustTalkLayoutWithInput = adjustTalkLayoutWithInput
}
}
\ No newline at end of file
package com.juling.work_onepage.util.widget
data class TalkTypeDataWithAdd(var na:String, var Res:Int, var type:Int)
\ No newline at end of file
package com.juling.work_onepage.util.widget
data class TalkTypeDataWithFeel(var na:String, var Res:Int, var type:Int)
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="5dp"/>
<solid android:color="@color/red"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white"/>
<corners android:radius="5dp"/>
</shape>
\ No newline at end of file
......@@ -22,7 +22,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout2"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_height="wrap_content"
android:background="@color/color_AAAAAA"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
......@@ -31,6 +31,15 @@
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0">
<com.juling.work_onepage.util.widget.TalkInputWidget
android:id="@+id/talk_input_widget"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
......
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<data></data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_f7f7f7">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout3"
android:layout_width="0dp"
android:layout_height="59dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0">
<EditText
android:id="@+id/et"
android:layout_width="270dp"
android:layout_height="39dp"
android:layout_marginStart="15dp"
android:background="@drawable/talk_input_draw"
android:padding="7dp"
android:text=""
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/ll_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="15dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/give_word_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/talk_give_word"
android:paddingLeft="7dp"
android:paddingRight="7dp"
android:text="文字"
android:textColor="@color/white"
android:visibility="gone" />
<ImageView
android:id="@+id/iv_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/talk_input_add" />
</LinearLayout>
<ImageView
android:id="@+id/iv_feel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="15dp"
android:background="@mipmap/talk_input_feel"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/ll_add"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/layout_feel"
android:layout_width="0dp"
android:layout_height="399dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.571"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout3"
app:layout_constraintVertical_bias="0.0">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/layout_add"
android:layout_width="0dp"
android:layout_height="100dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout3"
app:layout_constraintVertical_bias="0.0">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_add"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@mipmap/talk_input_feel"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/iv" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@mipmap/talk_input_feel"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/iv" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论