zoukankan      html  css  js  c++  java
  • Android 倒影实现算法【搜集】

    public class MirrorView extends View {
     Paint m_paint;
     int m_nShadowH;
     Drawable m_dw;
     Bitmap m_bitmap;
     
     //xxxx
     Matrix mMatrix;
     int shadowHeight;
     

     public MirrorView(Context context, Bitmap bitmap) {
      super(context);
      m_bitmap = bitmap;
      _Init();
     
      // TODO Auto-generated constructor stub
     }

     private void _Init() {
      //m_dw = new BitmapDrawable(BitmapFactory.decodeResource(getResources(),  R.drawable.icon));
      m_dw = new BitmapDrawable(m_bitmap);
      m_dw.setBounds(0,0,m_dw.getIntrinsicWidth(),m_dw.getIntrinsicHeight());
      m_nShadowH = m_dw.getIntrinsicHeight()/1;
      m_paint = new Paint(Paint.ANTI_ALIAS_FLAG);
      LinearGradient lg = new LinearGradient(0, 0, 0, m_nShadowH, 0xB0FFFFFF, 0x00000000, Shader.TileMode.CLAMP);
      m_paint.setShader(lg);
      m_paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY)); 
     
      //xxxx
      mMatrix = new Matrix();
     }

     
     
     @Override
     public void onDraw(Canvas canvas) {
      super.onDraw(canvas);
      int nX = 0;
      int nY = 0;
      _DrawNormalImg(canvas, nX, nY);
      _DrawMirror(canvas, nX, nY);
     }

     private void _DrawNormalImg(Canvas canvas, int nX, int nY) {
      canvas.save(Canvas.MATRIX_SAVE_FLAG);
      canvas.translate(nX, nY);
      m_dw.draw(canvas);
      canvas.restore();
     }

     private void _DrawMirror(Canvas canvas, int nX, int nY) {
      int nW = m_dw.getIntrinsicWidth();
      int nH = m_dw.getIntrinsicHeight();
    //  U.dout("nW="+nW+",nH="+nH);
     
     
      //xxxx
      shadowHeight=nH/2;
     
      //xxxx
      float[] src={0, nH, nW, nH, nW,nH - m_nShadowH, 0, nH - m_nShadowH};
      float[] dst={ 0, nH, nW, nH,nW, shadowHeight, 0, shadowHeight };
     
      //xxxx
      canvas.save();
      mMatrix.setPolyToPoly(src, 0, dst, 0, src.length >> 1);
      canvas.concat(mMatrix);
     
      //draw mirror image 
      canvas.save(Canvas.MATRIX_SAVE_FLAG);
      canvas.scale(1.0f, -1.0f);
      canvas.translate(nX, -(nY + nH * 2));
      canvas.clipRect(0, nH, nW, nH - m_nShadowH);
      m_dw.draw(canvas);
      canvas.restore();

     
      //draw mask 
      canvas.save();
      canvas.translate(nX, nY + nH);
      canvas.drawRect(0, 0, nW, m_nShadowH, m_paint);
      canvas.restore();
     
      //xxxx
      canvas.restore();
     }

    }

  • 相关阅读:
    努力的一分不会少
    C语言中的数组的访问方式
    代码的规划与规范化
    Manjaro中源码安装gcc7.1
    周围都是敌人,方法总比问题多
    elementary os 0.4.1下编译GCC-7.1源码并安装成功
    C语言中的基础知识变量探讨
    19年的桌面KDE的风雨和陪伴,没有什么能够割舍
    《手把手教你学C语言》学习笔记(10)--- 程序的循环控制
    copy 的实现原理与深浅拷贝
  • 原文地址:https://www.cnblogs.com/mxgsa/p/1905775.html
Copyright © 2011-2022 走看看