边界相交的布局

概念

        有时候会发现某些组件中各个子view的范围会有交叉,这种情况下没办法通过线性、相对等布局实现。因为view本身所占的区域必须是矩形区域。具体如下:

边界相交的布局_第1张图片

方法

        可以使用FrameLayout进行叠加。

        如果图形都一样的话,比如上图。可以使用canvas配合matrix进行旋转,然后绘制。示例如下:

示例

public class LayerView extends View {
	//apidemo中抄的,不懂
	private static final int LAYER_FLAGS = Canvas.MATRIX_SAVE_FLAG
			| Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
			| Canvas.FULL_COLOR_LAYER_SAVE_FLAG
			| Canvas.CLIP_TO_LAYER_SAVE_FLAG;
	private Paint mPaint;
	private Bitmap mBitmap;
	private int mWidth;
	private int mHeight;

	public LayerView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	public LayerView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public LayerView(Context context) {
		super(context);
		init();
	}

	private void init() {
		mPaint = new Paint();
		mPaint.setColor(Color.YELLOW);
		mPaint.setAntiAlias(true);
		mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img);
		mWidth = mBitmap.getWidth();
		mHeight = mBitmap.getHeight();
		mBitmapMatrix = new Matrix();
	}

	@SuppressWarnings("deprecation")
	@Override
	protected void onDraw(Canvas canvas) {
		Matrix matrix2 = canvas.getMatrix();
		saveMatrix(matrix2);
		for (int x = 0; x < 5; x++) {
			draw(canvas, matrix2, x * 72);
		}
	}

	private void draw(Canvas canvas, Matrix matrix, int rotate) {
		canvas.saveLayer(0, 0, getWidth(), getHeight(), null, LAYER_FLAGS);
		matrix.preTranslate(300 - mWidth, 300 - mHeight);
		matrix.preRotate(rotate, mWidth / 2, mWidth);//设置旋转中心
		canvas.setMatrix(matrix);
		canvas.drawBitmap(mBitmap, mBitmapMatrix, mPaint);
		canvas.restore();
		restoreMatrix(matrix);//恢复到没有进行改变的状态
	}

	private float[] data = new float[9];
	private Matrix mBitmapMatrix;

	/**
	 * 将matrix的值保存
	 */
	private void saveMatrix(Matrix matrix) {
		matrix.getValues(data);
	}

	/**
	 * 恢复matrix
	 */
	private void restoreMatrix(Matrix matrix) {
		matrix.setValues(data);
	}
}

问题

        没有处理点击事件,而且对于比较复杂的直接使用FrameLayout写更方便。

你可能感兴趣的:(边界相交的布局)