蒋洪波

fix bugs.1.optimize drawline method. 2.inputView request focus after choose emoji

... ... @@ -32,6 +32,7 @@ public abstract class AppBaseFragment<P extends BasePresenter> extends BaseFragm
protected BaseActivity mActivity;
protected CodeMultipleStatusView mRootView;
protected final String TAG = this.getClass().getSimpleName();
@Inject
protected P mPresenter;
... ... @@ -64,12 +65,22 @@ public abstract class AppBaseFragment<P extends BasePresenter> extends BaseFragm
mActivity = (BaseActivity) getActivity();
initComponent();
super.onActivityCreated(savedInstanceState);
if (!isLazyInflate()) {
inflate(savedInstanceState);
}
}
@Override
public void onLazyInitView(@Nullable Bundle savedInstanceState) {
super.onLazyInitView(savedInstanceState);
//加载我们自己的布局
if (isLazyInflate()) {
//加载我们自己的布局
inflate(savedInstanceState);
}
}
private void inflate(@Nullable Bundle savedInstanceState) {
View view = View.inflate(getContext(), this.getLayoutId(), null);
mRootView.setContentView(view);
mRootView.showContent();
... ... @@ -190,4 +201,11 @@ public abstract class AppBaseFragment<P extends BasePresenter> extends BaseFragm
*/
protected void retry() {
}
/**
* 是否需要懒加载
*/
protected boolean isLazyInflate() {
return true;
}
}
... ...
... ... @@ -8,7 +8,7 @@ ext {
compileSdkVersion : 25,
buildToolsVersion : "25.0.0",
minSdkVersion : 15,
targetSdkVersion : 23,
targetSdkVersion : 22,
versionCode : 1,
versionName : "1.0.0",
androidSupportSdkVersion: "25.0.0",
... ...
... ... @@ -46,7 +46,6 @@ public class Message {
private Boolean isSend;
private Boolean sendSucces;
private String time;
public boolean TimeIsShow;
public Message(int type, int state, String userRole,String fromUserName,
String fromUserAvatar, String toUserName, String toUserAvatar,
... ...
... ... @@ -8,7 +8,6 @@ import android.text.Spannable;
import android.text.TextUtils;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ListView;
import com.xdy.commonlibrary.core.AppBaseFragment;
... ... @@ -16,7 +15,6 @@ import com.xdy.commonlibrary.core.di.AppComponent;
import com.xdy.home.R;
import com.xdy.home.adapter.ChatAdapter;
import com.xdy.home.entity.ChatMsgEntity;
import com.xdy.home.entity.Emojicon;
import com.xdy.home.entity.Faceicon;
import com.xdy.home.entity.Message;
import com.xdy.home.util.AccountUtils;
... ... @@ -26,7 +24,6 @@ import com.xdy.home.widget.chat.KJChatKeyboard;
import com.xdy.home.widget.chat.OnOperationListener;
import com.xdy.home.widget.emoji.DisplayRules;
import com.xdy.util.LogUtil;
import com.xdy.util.ResUtil;
import org.kymjs.kjframe.ui.ViewInject;
import org.kymjs.kjframe.utils.KJLoger;
... ... @@ -34,7 +31,6 @@ import org.kymjs.kjframe.utils.StringUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
... ... @@ -54,6 +50,11 @@ public class ChatFragment extends AppBaseFragment<LivePresenter> implements Live
mPresenter = presenter;
}
@Override
protected boolean isLazyInflate() {
return false;
}
private KJChatKeyboard box;
private ListView mRealListView;
private Context mContext;
... ... @@ -125,6 +126,7 @@ public class ChatFragment extends AppBaseFragment<LivePresenter> implements Live
Spannable spanText = (Spannable) info;
Selection.setSelection(spanText, start + emoji.length());
}
box.setEditTextFocus();
}
}
... ...
... ... @@ -3,6 +3,8 @@ package com.xdy.home.ui;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.util.DisplayMetrics;
... ... @@ -10,6 +12,7 @@ import android.view.View;
import com.bumptech.glide.Glide;
import com.xdy.commonlibrary.core.AppBaseFragment;
import com.xdy.commonlibrary.core.BaseRunnable;
import com.xdy.commonlibrary.core.di.AppComponent;
import com.xdy.home.R;
import com.xdy.home.entity.UpdateDoc;
... ... @@ -44,6 +47,7 @@ public class DocFragment extends AppBaseFragment<LivePresenter> implements LiveC
private CanvasView mCanvasView;
private UpdateDoc mUpdateDoc;
private boolean replay;
private long intervalTime;
public void setPresenter(LivePresenter presenter) {
mPresenter = presenter;
... ... @@ -109,21 +113,60 @@ public class DocFragment extends AppBaseFragment<LivePresenter> implements LiveC
}
}
public final static int SEND = 0;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
int what = msg.what;
WhiteboardUpdateEntity obj = (WhiteboardUpdateEntity) msg.obj;
switch (what) {
case SEND:
mCanvasView.drawLine(obj.annotaionItems);
break;
}
}
};
/**
* @param entity
*/
@Override
public void renderUpdateAnnotation(WhiteboardUpdateEntity entity) {
if (entity != null) {
if (entity.isFresh) {
if (intervalTime != 0) {
intervalTime = System.currentTimeMillis() - intervalTime;
if (intervalTime < 150) {//小于100毫秒 不执行?
handler.removeCallbacksAndMessages(null);
}
delayDraw(entity);
} else {
delayDraw(entity);
}
intervalTime = System.currentTimeMillis();
}
private void delayDraw(final WhiteboardUpdateEntity entity) {
handler.postDelayed(new BaseRunnable<WhiteboardUpdateEntity>(entity) {
@Override
protected void handle(WhiteboardUpdateEntity o) {
drawline(entity);
}
}, 200);
}
private void drawline(WhiteboardUpdateEntity o) {
if (o != null) {
if (o.isFresh) {
if (mCanvasView != null) {
mCanvasView.clear();
}
}
if (entity.annotaionItems != null) {
if (o.annotaionItems != null) {
if (mCanvasView != null) {
mCanvasView.drawLine(entity.annotaionItems);
mCanvasView.drawLine(o.annotaionItems);
}
}
}
... ... @@ -157,6 +200,7 @@ public class DocFragment extends AppBaseFragment<LivePresenter> implements LiveC
.get();
wrapDocBitMapEntity.setNoDoc(false);
wrapDocBitMapEntity.setBitmap(bitmap);
}
return wrapDocBitMapEntity;
} catch (InterruptedException e) {
... ... @@ -174,13 +218,20 @@ public class DocFragment extends AppBaseFragment<LivePresenter> implements LiveC
@Override
public void call(WrapDocBitMapEntity resource) {
if (resource.getBitmap() == null) {
showMessage("图片获取失败");
Bitmap bitmap = getNoDocBitmap();
mCanvasView.setBitmap(bitmap, false);
} else {
mCanvasView.setBitmap(resource.getBitmap(), !resource.showNoDoc());
}
//用handler发送 跟drawline在一个队列里执行,否则顺序乱了导致切换图片的时候还有上一个画面的标注
handler.post(new BaseRunnable<WrapDocBitMapEntity>(resource) {
@Override
protected void handle(WrapDocBitMapEntity wrapDocBitMapEntity) {
if (wrapDocBitMapEntity.getBitmap() == null) {
showMessage("图片获取失败");
Bitmap bitmap = getNoDocBitmap();
mCanvasView.setBitmap(bitmap, false);
} else {
mCanvasView.setBitmap(wrapDocBitMapEntity.getBitmap(), !wrapDocBitMapEntity.showNoDoc());
}
}
});
}
});
}
... ...
... ... @@ -62,6 +62,7 @@ import java.util.Random;
import me.yokeyword.fragmentation.SupportFragment;
import static com.pili.pldroid.player.AVOptions.KEY_DELAY_OPTIMIZATION;
import static com.xdy.home.R.mipmap.play;
/**
* @author Administrator
... ... @@ -218,6 +219,7 @@ public class LiveFragment extends AppBaseFragment<LivePresenter> implements Live
}
});
viewPager.setPagingEnabled(false);
viewPager.setOffscreenPageLimit(3);
mAdapter = new HomeAdapter(getChildFragmentManager(), mFragments);
viewPager.setAdapter(mAdapter);
slidingTab.setViewPager(viewPager, titles);
... ... @@ -433,6 +435,29 @@ public class LiveFragment extends AppBaseFragment<LivePresenter> implements Live
}
@Override
public void onPause() {
super.onPause();
if (!replay) {
if (mPresenter.isVideoMode())
stopVideo();
else
stopAudio();
} else {
mPresenter.pauseAndStart(true);
}
}
@Override
public void onResume() {
super.onResume();
if (!replay) {
mPresenter.restart();
} else {
mPresenter.pauseAndStart(false);
}
}
@Override
public void showOperation(boolean b) {
if (b)
operation.setVisibility(View.VISIBLE);
... ... @@ -469,7 +494,7 @@ public class LiveFragment extends AppBaseFragment<LivePresenter> implements Live
if (!replay) {
mPresenter.close();
} else {
if (!mPresenter.isVideoMode() && mVideoView != null)
if (!mPresenter.isVideoMode() && mVideoView != null && mVideoView.isPlaying())
mVideoView.stopPlayback();
}
}
... ... @@ -487,7 +512,7 @@ public class LiveFragment extends AppBaseFragment<LivePresenter> implements Live
if (!replay) {
mPresenter.close();
} else {
if (mPresenter.isVideoMode() && mVideoView != null)
if (mPresenter.isVideoMode() && mVideoView != null && mVideoView.isPlaying())
mVideoView.stopPlayback();
}
}
... ... @@ -697,7 +722,7 @@ public class LiveFragment extends AppBaseFragment<LivePresenter> implements Live
@Override
public void updatePausePlay() {
if (mPresenter.getRecordStatus())
mPauseButton.setImageResource(R.mipmap.play);
mPauseButton.setImageResource(play);
else
mPauseButton.setImageResource(R.mipmap.stop);
}
... ...
... ... @@ -339,6 +339,8 @@ public class LivePresenter extends BasePresenter<LiveContract.Model, LiveContrac
mRootView.resetSeekBar();
docView.clear();
chatView.clearChatHistory();
currentPlayAudio = null;
currentPlayVideo = null;
}
break;
case Constants.RECORD_PAUSE:
... ... @@ -372,6 +374,7 @@ public class LivePresenter extends BasePresenter<LiveContract.Model, LiveContrac
currentPlayAudio.getMediaId() == audio.getMediaId()) {
mRootView.showOperation(false);
mRootView.stopAudio();
currentPlayAudio = null;
}
}
... ... @@ -391,6 +394,7 @@ public class LivePresenter extends BasePresenter<LiveContract.Model, LiveContrac
currentPlayVideo.getMediaId() == videoEntity.getMediaId()) {
mRootView.stopVideo();
mRootView.showOperation(false);
currentPlayVideo = null;
}
}
... ... @@ -835,6 +839,14 @@ public class LivePresenter extends BasePresenter<LiveContract.Model, LiveContrac
return connceted;
}
public void restart() {
if (isVideoMode() && currentPlayVideo != null) {
mRootView.playVideo(currentPlayVideo);
} else if (currentPlayAudio != null) {
mRootView.playAudio(currentPlayAudio);
}
}
class EventHande implements SmartEventCallback {
@Override
... ...
... ... @@ -449,7 +449,7 @@ public class CanvasView extends SurfaceView implements SurfaceHolder.Callback, V
this.setOnTouchListener(this);
// 设置背景为透明 否则是黑色
this.setZOrderOnTop(true);
// this.setZOrderMediaOverlay(true);
// this.setZOrderMediaOverlay(true);
this.getHolder().setFormat(PixelFormat.TRANSLUCENT);
// this.pathLists.add(new Path());
... ... @@ -541,7 +541,7 @@ public class CanvasView extends SurfaceView implements SurfaceHolder.Callback, V
for (PointGroupEntity pointXy : pointXies) {
float w = pointXy.w;
float h = pointXy.h + (FLOAT_TYPE * currentOffsetY) / (FLOAT_TYPE * finalWidth) * 100f;
pointXy.h =h;
pointXy.h = h;
}
//操作一下這個點
... ...
... ... @@ -155,6 +155,7 @@ public class KJChatKeyboard extends RelativeLayout implements
return new OnClickListener() {
@Override
public void onClick(View v) {
setEditTextFocus();
if (isShow() && which == layoutType) {
hideLayout();
showKeyboard(context);
... ... @@ -168,6 +169,17 @@ public class KJChatKeyboard extends RelativeLayout implements
};
}
public void setEditTextFocus(){
if (mEtMsg!=null){
mEtMsg.setFocusable(true);
mEtMsg.setFocusableInTouchMode(true);
mEtMsg.requestFocus();
mEtMsg.findFocus();
mEtMsg.invalidate();
}
}
private void changeLayout(int mode) {
adapter = new FaceCategroyAdapter(((FragmentActivity) getContext())
.getSupportFragmentManager(), mode);
... ... @@ -215,6 +227,8 @@ public class KJChatKeyboard extends RelativeLayout implements
public void showLayout() {
hideKeyboard(this.context);
// 延迟一会,让键盘先隐藏再显示表情键盘,否则会有一瞬间表情键盘和软键盘同时显示
postDelayed(new Runnable() {
@Override
public void run() {
... ... @@ -268,6 +282,8 @@ public class KJChatKeyboard extends RelativeLayout implements
.getWindowToken(), 0);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
}
}
... ...
... ... @@ -139,5 +139,10 @@ public enum DisplayRules {
KeyEvent event = new KeyEvent(0, 0, 0, KeyEvent.KEYCODE_DEL, 0, 0, 0,
0, KeyEvent.KEYCODE_ENDCALL);
editText.dispatchKeyEvent(event);
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
editText.requestFocus();
editText.findFocus();
editText.invalidate();
}
}
... ...
... ... @@ -51,6 +51,11 @@ public class EmoticonsEditText extends EditText {
public void setText(CharSequence text, BufferType type) {
if (!TextUtils.isEmpty(text)) {
super.setText(replace(text), type);
/*setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
findFocus();
invalidate();*/
} else {
super.setText(text, type);
}
... ...