zoukankan      html  css  js  c++  java
  • Android 颜色渲染(七) RadialGradient 环形渲染实现水波纹效果

    利用环形渲染我们可以做到什么? 其实很多都是非常常见的,比如上一篇实现的帮帮糖效果, 彩色的热气球,比如这里要讲到的水波纹效果,或者也可以理解为扩散色渲染效果

    首先看一下效果图:

                                                        

    轻触屏幕,即可看到对应的效果,可以看到,实现这种效果,利用RadialGradient ,只需简单几行代码:

    MainActivity:

    package com.tony.testshader;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.view.Menu;
    import android.widget.SeekBar;
    import android.widget.SeekBar.OnSeekBarChangeListener;
    
    public class MainActivity extends Activity  implements OnSeekBarChangeListener{
    
         private WaterRipplesView waterRipplesView;
         
         
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            
            waterRipplesView = new WaterRipplesView(this);
            setContentView(waterRipplesView);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
      
    
    }


    WaterRipplesView:

    package com.tony.testshader;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapShader;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.RadialGradient;
    import android.graphics.Shader;
    import android.graphics.drawable.BitmapDrawable;
    import android.graphics.drawable.ShapeDrawable;
    import android.graphics.drawable.shapes.OvalShape;
    import android.util.AttributeSet;
    import android.util.DisplayMetrics;
    import android.view.MotionEvent;
    import android.view.View;
    /**
     * 水波纹效果
     * @author tony
     *
     */
    
     public class WaterRipplesView extends View {
    
    	Shader mBitmapShader = null;
    	Bitmap mBitmapPn = null;
    	Paint mPaint = null;
    	Shader mRadialGradient = null;
    	Canvas mCanvas = null;
    	ShapeDrawable mShapeDrawable = null;
    
    	public WaterRipplesView(Context context) {
    		super(context);
    
    		// 初始化工作
    		Bitmap bitmapTemp = ((BitmapDrawable) getResources().getDrawable(
    				R.drawable.leaf)).getBitmap();
    		DisplayMetrics dm = getResources().getDisplayMetrics();
    		// 创建与当前使用的设备窗口大小一致的图片
    		mBitmapPn = Bitmap.createScaledBitmap(bitmapTemp, dm.widthPixels,
    				dm.heightPixels, true);
    		// 创建BitmapShader object
    		mBitmapShader = new BitmapShader(mBitmapPn, Shader.TileMode.REPEAT,
    				Shader.TileMode.MIRROR);
    		mPaint = new Paint();
    	}
    
    	public WaterRipplesView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    	}
    
    	@Override
    	protected void onDraw(Canvas canvas) {
    		// TODO Auto-generated method stub
    		super.onDraw(canvas);
    
    		// 将图片裁剪为椭圆型
    		// 创建ShapeDrawable object,并定义形状为椭圆
    		mShapeDrawable = new ShapeDrawable(new OvalShape());// OvalShape:椭圆
    		// 设置要绘制的椭圆形的东西为ShapeDrawable图片
    		mShapeDrawable.getPaint().setShader(mBitmapShader);
    		// 设置显示区域
    		mShapeDrawable.setBounds(0, 0, mBitmapPn.getWidth(),
    				mBitmapPn.getHeight());
    		// 绘制ShapeDrawable
    		mShapeDrawable.draw(canvas);
    		if (mRadialGradient != null) {
    			mPaint.setShader(mRadialGradient);
    			canvas.drawCircle(0, 0, 1000, mPaint);
    		}
    
    	}
    
    	// @覆写触摸屏事件
    	public boolean onTouchEvent(MotionEvent event) {
    		// @设置alpha通道(透明度)
    		mPaint.setAlpha(400);
    		mRadialGradient = new RadialGradient(event.getX(), event.getY(), 48,
    				new int[] { Color.WHITE, Color.TRANSPARENT },null, Shader.TileMode.REPEAT);
    		// @重绘
    		postInvalidate();
    		return true;
    	}
    
    }



  • 相关阅读:
    数以百万计美元的融资YO是什么东东?
    工作流和审批流
    Linux makefile 教程 很具体,且易懂
    【吐槽】火车票一票难求啊
    poj 2828 Buy Tickets(树状数组 | 线段树)
    如花搞笑图片集锦(转贴)
    苹果开发人员账号注冊流程
    优秀团队建设--美国式团队(ppt)
    屏幕分辨率(QQVGA、QVGA、VGA、XGA、WXGA、WUXGA和WSXGA+)
    怎样设计接口?
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3293779.html
Copyright © 2011-2022 走看看