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



  • 相关阅读:
    51 Nod 1086 多重背包问题(单调队列优化)
    51 Nod 1086 多重背包问题(二进制优化)
    51 Nod 1085 01背包问题
    poj 2559 Largest Rectangle(单调栈)
    51 Nod 1089 最长回文子串(Manacher算法)
    51 Nod N的阶乘的长度 (斯特林近似)
    51 Nod 1134 最长递增子序列(经典问题回顾)
    51 Nod 1020 逆序排列
    PCA-主成分分析(Principal components analysis)
    Python中cPickle
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3293779.html
Copyright © 2011-2022 走看看