这个在TV上用的挺多的, 网上很多都是对ImageView的图片做的, 感觉不是很好, 这里实现了一个可以对任何View做倒影的.
效果图
/** * * @className: MirrorView * @description: 对普通View做封装, 让这个View出现倒影效果, 注意,使用这个View之后, * 会让原来的View的Height扩大REFHEIGHT高度, 用来显示反射镜面, * @author: gaoshuai * @date: 2015年8月11日 上午11:31:16 */ public class MirrorView extends FrameLayout { private View mContentView; protected boolean mHasReflection = true; private static int REFHEIGHT = -1; public static Paint RefPaint = null; private Bitmap mReflectBitmap; private Canvas mReflectCanvas; public MirrorView(Context context) { super(context); if (REFHEIGHT == -1) REFHEIGHT = 100; if (RefPaint == null) { RefPaint = new Paint(Paint.ANTI_ALIAS_FLAG); RefPaint.setShader(new LinearGradient(0, 0, 0, REFHEIGHT, new int[] { 0x77000000, 0x66AAAAAA, 0x0500000, 0x00000000 }, new float[] { 0.0f, 0.1f, 0.9f, 1.0f }, Shader.TileMode.CLAMP)); RefPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); } this.setClickable(true); } public void setContentView(View view) { FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); lp.bottomMargin = REFHEIGHT; mContentView = view; addView(view, lp); } public View getContentView() { return mContentView; } public void setReflection(boolean ref) { mHasReflection = ref; } @Override public boolean performClick() { return mContentView.performClick(); } @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); if (mHasReflection) { if (mReflectBitmap == null) { mReflectBitmap = Bitmap.createBitmap(mContentView.getWidth(), REFHEIGHT, Bitmap.Config.ARGB_8888); mReflectCanvas = new Canvas(mReflectBitmap); } drawReflection(mReflectCanvas, mContentView); //绘制这个View的反射效果 canvas.save(); int dy = mContentView.getBottom(); int dx = mContentView.getLeft(); canvas.translate(dx, dy); canvas.drawBitmap(mReflectBitmap, 0, 0, null); canvas.restore(); } } public Bitmap getReflectBitmap() { return mReflectBitmap; } public void drawReflection(Canvas canvas, View view) { canvas.save(); canvas.clipRect(0, 0, view.getWidth(), REFHEIGHT); canvas.save(); canvas.scale(1, -1); canvas.translate(0, -view.getHeight()); view.draw(canvas); canvas.restore(); canvas.drawRect(0, 0, view.getWidth(), REFHEIGHT, RefPaint); canvas.restore(); } }
测试Activity
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FrameLayout container = (FrameLayout) findViewById(R.id.test); MirrorView mirrorItemView = new MirrorView(this); TextView textView = new TextView(this); textView.setWidth(300); textView.setText("我就是想测试一下镜子View"); textView.setBackgroundResource(R.drawable.ic_launcher); mirrorItemView.setContentView(textView); container.addView(mirrorItemView); } }
时间: 2024-10-19 10:47:31