如今的社交類App,聊天都是標配,此外在聊天的基礎上還衍生出了不少功能,如表情包,背景,氣泡等。java
某一天測試給我提了一個bug,說,軟鍵盤彈起收攏的時候聊天背景圖會抖動。要解決下。我很納悶,這塊用的不是ImageView來實現的麼,Android的效果是咋樣,就是咋樣啊。我咋知道怎麼改呢?canvas
向測試小姐姐吐槽後,小姐姐用微信聊天背景圖打了個人臉😂,貌似微信的是對的。我又仔細瞅了瞅網易雲信的聊天界面這塊的效果,發現,恩,網易雲信針對這個問題處理過了,軟鍵盤彈起收攏,背景圖不會抖。研究了幾分鐘,找到了關鍵代碼。因而今天把代碼抄下來,記錄下。之後就不會在碰到這種問題了(⊙o⊙)…微信
網易雲信繼承重寫了ImageView的部分方法:ide
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方法作了處理。這個方法還沒深究😂spa