package cn.wildfire.chat.kit.widget; import android.content.Context; import android.graphics.Paint; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.animation.DecelerateInterpolator; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import cn.wildfire.chat.kit.R; import cn.wildfire.chat.kit.conversation.ConversationFragment; import cn.wildfire.chat.kit.conversation.ConversationInputPanel; import cn.wildfire.chat.kit.third.utils.UIUtils; import cn.wildfire.chat.kit.utils.nuitoken.NuiManager; import com.alibaba.idst.nui.Constants; import com.zlw.main.recorderlib.recorder.RecordHelper; import java.io.File; import java.util.Date; /** * @author kimi * @description * @date 2021-01-13 11:11 */ public class RecordTextView extends LinearLayout implements View.OnClickListener, View.OnTouchListener { private Context context; private TextView mTvRecordText; private ImageView mIvBack; private TextView mTvClear; private ImageView mIvRecord; private TextView mTvSend; private TextView mTvTouchInfo; private LineWaveVoiceView mLineWareView; private ObjectRippleView mRippleView; private ConversationFragment parentFragment; private long clickTime; private String prepareText = "请说话..."; private boolean isFirst = true; private ConversationInputPanel parentPanel; public RecordTextView(Context context) { this(context, null, 0); } public RecordTextView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public RecordTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.context = context; View view = LayoutInflater.from(context).inflate(R.layout.view_record_text, this, true); initViewId(view); initViewShow(); initListener(); initRecord(); } private void initRecord() { NuiManager.OnNuiManagerCallBack nuiManagerCallBack = new NuiManager.OnNuiManagerCallBack() { @Override public void onTimerHandler(long pastTime, long reMainTime) { } @Override public void onNuiVprEventCallback(Constants.NuiVprEvent nuiVprEvent) {} @Override public void onNuiAudioRMSChanged(float v) { mLineWareView.setNowAmp(v); } @Override public void onNuiAudioStateChanged(Constants.AudioState state) { } @Override public void onRecordFinish(File result) { } @Override public void showNuiText(String asrResult) { UIUtils.postTaskSafely(new Runnable() { @Override public void run() { if (isFirst) { mTvRecordText.setTextColor(UIUtils.getColor(R.color.black_title)); mTvRecordText.setText(asrResult); } else { mTvRecordText.setText(mTvRecordText.getText().toString() + asrResult); } isFirst = false; } }); } @Override public void onInitFinish() { mTvRecordText.setText(prepareText); } }; NuiManager.getInstance().init(context, nuiManagerCallBack); } private void initListener() { mIvBack.setOnClickListener(this); mTvSend.setOnClickListener(this); mTvClear.setOnClickListener(this); mIvRecord.setOnTouchListener(this); } public void initViewShow() { if (mTvClear == null) { return; } if (mTvClear.isShown()) { mTvClear.setVisibility(GONE); } if (mTvSend.isShown()) { mTvSend.setVisibility(INVISIBLE); } mIvBack.setVisibility(VISIBLE); mIvRecord.setVisibility(VISIBLE); mTvRecordText.setText(prepareText); mTvRecordText.setTextColor(UIUtils.getColor(R.color.comment_gary)); mLineWareView.setVisibility(INVISIBLE); } private void initViewId(View view) { mTvRecordText = view.findViewById(R.id.tv_record_text); mIvBack = view.findViewById(R.id.iv_back); mTvClear = view.findViewById(R.id.tv_clear); mIvRecord = view.findViewById(R.id.iv_record); mTvSend = view.findViewById(R.id.tv_send); mRippleView = view.findViewById(R.id.ripple_view); mTvTouchInfo = view.findViewById(R.id.tv_touch_info); mLineWareView = view.findViewById(R.id.view_line_wave); initRippleView(); } public void setParentPanel(ConversationInputPanel parentPanel) { this.parentPanel = parentPanel; } private void initRippleView() { mRippleView.setColor(UIUtils.getColor(R.color.colorGreen)); mRippleView.setDuration(3000); mRippleView.setStyle(Paint.Style.FILL); mRippleView.setInterpolator(new DecelerateInterpolator()); } @Override public void onClick(View v) { int id = v.getId(); if (id == R.id.iv_back) { parentFragment.getConversationInputPanel().hideReocrdView(); } else if (id == R.id.tv_send) { //发送消息 NuiManager.getInstance().endRecord(); parentPanel.setInputText(mTvRecordText.getText().toString()); parentPanel.getSendButton().performClick(); this.setVisibility(GONE); } else if (id == R.id.tv_clear) { mTvRecordText.setText(prepareText); mTvRecordText.setTextColor(UIUtils.getColor(R.color.comment_gary)); isFirst = true; mIvBack.setVisibility(VISIBLE); mTvClear.setVisibility(GONE); mTvSend.setVisibility(INVISIBLE); mLineWareView.setVisibility(INVISIBLE); } } @Override public boolean onTouch(View v, MotionEvent event) { RecordHelper.RecordState state = NuiManager.getInstance().getState(); if (MotionEvent.ACTION_DOWN == (event.getAction())) { if (!NuiManager.getInstance().ismInit()) { UIUtils.postTaskSafely(new Runnable() { @Override public void run() { Toast.makeText(context, "正在初始化中...", Toast.LENGTH_SHORT).show(); } }); } else { mLineWareView.setVisibility(INVISIBLE); mLineWareView.startRecord(); mTvTouchInfo.setVisibility(GONE); clickTime = new Date().getTime(); mRippleView.start(); // mIvBack.setVisibility(GONE); if (state.equals(RecordHelper.RecordState.IDLE)) { NuiManager.getInstance().startRecord(); } else { NuiManager.getInstance().resume(); } } return true; } else if (MotionEvent.ACTION_UP == event.getAction()) { long endTime = new Date().getTime(); mRippleView.stopImmediately(); mLineWareView.stopRecord(); mTvClear.setVisibility(VISIBLE); mIvBack.setVisibility(GONE); mTvSend.setVisibility(VISIBLE); if (endTime - clickTime < 500) { // 不做操作 } else { if (state.equals(RecordHelper.RecordState.RECORDING)) { NuiManager.getInstance().pause(); } } return true; } return false; } public void setFragment(Fragment fragment) { this.parentFragment = (ConversationFragment) fragment; } }