Androidチャットの背景図で出会った問題のまとめ
4649 ワード
現在のソーシャルアプリは、チャットが標準装備されているほか、表情パック、背景、気泡など、チャットの基礎に多くの機能が派生しています.
ある日テストでバグを提出して、ソフトキーボードが弾けて収まるとチャットの背景図が震えると言った.解決しなければならない.これはImageViewで実現されたのではないか、Androidの効果はどうなのか、どうなのか、と悩んでいます.どうやって直すか知ってるの?
テストのお姉さんにツッコミを入れた後、お姉さんは微信チャットの背景図で私の顔を殴った.微信は正しいようだ.私はまたネット易雲信のチャットインターフェースのこの効果をよく見て、発見して、うん、ネット易雲信はこの問題に対して処理して、ソフトキーボードが弾いて収めて、背景図は震えません.数分間検討して、キーコードを見つけました.そこで今日はコードを写して、記録します.これからはこんな問題にぶつかることはありません(⊙o⊙)...
網易雲信継承はImageViewの一部の方法を書き換えた.
MsgBkImageView.java
onDrawメソッドを書き直したように見えますcanvas.translateメソッドで処理しました.この方法はまだ詳しく研究されていない.
ある日テストでバグを提出して、ソフトキーボードが弾けて収まるとチャットの背景図が震えると言った.解決しなければならない.これはImageViewで実現されたのではないか、Androidの効果はどうなのか、どうなのか、と悩んでいます.どうやって直すか知ってるの?
テストのお姉さんにツッコミを入れた後、お姉さんは微信チャットの背景図で私の顔を殴った.微信は正しいようだ.私はまたネット易雲信のチャットインターフェースのこの効果をよく見て、発見して、うん、ネット易雲信はこの問題に対して処理して、ソフトキーボードが弾いて収めて、背景図は震えません.数分間検討して、キーコードを見つけました.そこで今日はコードを写して、記録します.これからはこんな問題にぶつかることはありません(⊙o⊙)...
網易雲信継承はImageViewの一部の方法を書き換えた.
MsgBkImageView.java
public class MsgBkImageView extends AppCompatImageView {
public MsgBkImageView(Context context) {
super(context);
init();
}
public MsgBkImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MsgBkImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private final void init() {
super.setScaleType(ScaleType.CENTER_CROP);
}
@Override
public final void setScaleType(ScaleType scaleType) {
// REJECT
}
@Override
protected void onDraw(Canvas canvas) {
Drawable dr = getDrawable();
if (dr == null) {
super.onDraw(canvas);
return;
}
int dwidth = dr.getBounds().width();
int dheight = dr.getBounds().height();
int vwidth = getWidth() - getPaddingLeft() - getPaddingRight();
int vheight = getHeight() - getPaddingTop() - getPaddingBottom();
float scale;
float dx = 0, dy = 0;
if (dwidth * vheight > vwidth * dheight) {
scale = (float) vheight / (float) dheight;
dx = (vwidth - dwidth * scale) * 0.5f;
} else {
scale = (float) vwidth / (float) dwidth;
dy = (vheight - dheight * scale) * 0.5f;
}
canvas.save();
canvas.translate(0, -(int) (dy + 0.5f));
super.onDraw(canvas);
canvas.restore();
}
}
onDrawメソッドを書き直したように見えますcanvas.translateメソッドで処理しました.この方法はまだ詳しく研究されていない.