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();
     }

    }

  • 相关阅读:
    实现Maven自动下载源代码包并关联
    Maven3入门篇
    小典故:为什么数组的索引总是从0开始,而不是1?
    C语言算法探究之(一):算法的准确性
    C语言算法探究之(二):算法的准确性
    Visual Studio对无用引用(unused using)的处理方法
    C# CRC8的实现(原创)
    C#4.0:新功能和展望
    C#控件重绘学习(一)
    双加号(++)在C#中的用法解释
  • 原文地址:https://www.cnblogs.com/jiezzy/p/2599716.html
Copyright © 2011-2022 走看看