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



  • 相关阅读:
    for循环练习-----ATM取款
    面向对象基础项目----图书管理系统(数组)
    Java基础学习(二)-- 二维数组、String、StringBuffer以及类和对象之详解
    Java基础学习(一) -- Java环境搭建、数据类型、分支循环等控制结构、简单一维数组详解
    js 解决由于&#65279(bom文件格式)产生的空白行
    自适应网站设计对百度友好的关键:添加applicable-device标签(转)
    浏览器内核控制标签--meta
    HTML5的元素与结构标签
    <img>标签的补充
    HTML <head> 头部中的各类标签
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3293779.html
Copyright © 2011-2022 走看看