package com.freelib.multiitem.helper; import android.view.View; import java.util.ArrayList; import java.util.List; /** * 视图缩放控制类 * 适用于多Recycler类型的缩放 * Created by free46000 on 2017/3/31. */ public class ViewScaleHelper { public static final int VIEW_WIDTH_KEY = -21681; public static final int VIEW_HEIGHT_KEY = -21682; private List<View> verticalViewList = new ArrayList<>(); private View contentView; private View horizontalView; private boolean isInScaleMode; private int verticalWidth; private float scale = 0.5f; public synchronized boolean isInScaleMode() { return isInScaleMode; } public float getScale() { return scale; } /** * 开启或关闭缩放模式 */ public void toggleScaleModel() { if (isInScaleMode) { stopScaleModel(); } else { startScaleModel(); } } /** * 开启缩放 */ public synchronized void startScaleModel() { if (isInScaleMode) { return; } isInScaleMode = true; scaleContentView(contentView); scaleContentView(horizontalView); horizontalView.setScaleX(scale); horizontalView.setScaleY(scale); horizontalView.setPivotX(0f); horizontalView.setPivotY(0f); for (View view : verticalViewList) { //当父视图setScaleX的时候此时的宽度即为需要被记住的宽度,这样可以保证缩小后的宽度不再次恢复原来的大小 verticalWidth = view.getWidth(); scaleVerticalView(view, verticalWidth); view.requestLayout(); } } /** * 关闭缩放 */ public synchronized void stopScaleModel() { if (!isInScaleMode) { return; } isInScaleMode = false; restoreView(contentView); restoreView(horizontalView); for (View view : verticalViewList) { restoreView(view); view.requestLayout(); } horizontalView.setScaleX(1f); horizontalView.setScaleY(1f); } public void addVerticalView(View view) { verticalViewList.add(view); if (isInScaleMode) { scaleVerticalView(view, verticalWidth); } } /** * 缩放垂直视图 * 垂直的视图宽度需要记住当前缩小后的宽度,然后设置到layout param,不然会充满屏幕宽度 * 高度无需控制,就是需要充满屏幕 * * @param width 需要被保持的宽度 */ private void scaleVerticalView(View view, int width) { recordViewWidth(view); view.getLayoutParams().width = width; } /** * 缩放内容视图 * 内容视图高宽需要缩放1/scale倍数,后续进行setScaleX and Y的时候才能和原来的视图同等大小 * * @param view */ private void scaleContentView(View view) { recordViewWidth(view); recordViewHeight(view); view.getLayoutParams().width = (int) (view.getWidth() / scale); view.getLayoutParams().height = (int) (view.getHeight() / scale); } private void recordViewWidth(View view) { view.setTag(VIEW_WIDTH_KEY, view.getLayoutParams().width); } private void recordViewHeight(View view) { view.setTag(VIEW_HEIGHT_KEY, view.getLayoutParams().height); } private void restoreView(View view) { Object tag = null; if ((tag = view.getTag(VIEW_WIDTH_KEY)) != null) { view.getLayoutParams().width = (int) tag; } if ((tag = view.getTag(VIEW_HEIGHT_KEY)) != null) { view.getLayoutParams().height = (int) tag; } } public View getContentView() { return contentView; } public void setContentView(View contentView) { this.contentView = contentView; } public View getHorizontalView() { return horizontalView; } public void setHorizontalView(View horizontalView) { this.horizontalView = horizontalView; } }