1.先上没有填充效果的代码和效果图
myview负责画出一个红色的手机屏幕大小的矩形,至于填充什么,自己加。
public class MyView extends View { // 声明画笔 public Paint paint; public MyView(Context context) { super(context); paint = new Paint(); paint.setColor(Color.RED); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); paint = new Paint(); paint.setColor(Color.RED); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 使用指定Paint对象画矩形 Log.i("mydate" , " " + getWidth() + " " + getHeight()); canvas.drawRect(0, 0, getWidth(), getHeight(), paint); } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.example.liuyan.testshader.MyView android:id="@+id/myviw" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void onClick(View v) { } }
2.加上填充效果 BitmapShader
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ MyView myView; private Matrix matrix = new Matrix(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); DisplayMetrics metrics = new DisplayMetrics(); display.getMetrics(metrics); float screenwidth = metrics.widthPixels; float screenhight = metrics.heightPixels; myView = (MyView) findViewById(R.id.myviw); Bitmap bm = BitmapFactory.decodeResource(getResources() , R.drawable.ly); int width = bm.getWidth(); int height = bm.getHeight(); float scale = screenwidth/2/width; //显示图片的缩放比例 float scale2 = screenhight/2/height; matrix.setScale(scale , scale2); //将显示的图片缩放到屏幕大小 Bitmap bj = Bitmap.createBitmap(bm , 0 ,0 , width , height , matrix , true); Shader shader0 = new BitmapShader(bj , Shader.TileMode.REPEAT , Shader.TileMode.MIRROR);//x方向重复,y方向镜像 //******************************************** myView.paint.setShader(shader0); //将填充效果传入 myView.invalidate(); //重新绘制 } @Override public void onClick(View v) { } }
3.加上填充效果LinearGradient
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ MyView myView; private Matrix matrix = new Matrix(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myView = (MyView) findViewById(R.id.myviw);; /*WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); DisplayMetrics metrics = new DisplayMetrics(); display.getMetrics(metrics); float screenwidth = metrics.widthPixels; float screenhight = metrics.heightPixels; Bitmap bm = BitmapFactory.decodeResource(getResources() , R.drawable.ly); int width = bm.getWidth(); int height = bm.getHeight(); float scale = screenwidth/2/width; //显示图片的缩放比例 float scale2 = screenhight/2/height; matrix.setScale(scale , scale2); //将显示的图片缩放到屏幕大小 Bitmap bj = Bitmap.createBitmap(bm , 0 ,0 , width , height , matrix , true); Shader shader0 = new BitmapShader(bj , Shader.TileMode.REPEAT , Shader.TileMode.MIRROR); myView.paint.setShader(shader0); //将填充效果传入 myView.invalidate(); //重新绘制*/ //************************************************ int[] colors = new int[]{Color.RED , Color.GREEN , Color.BLUE}; Shader shader1 = new LinearGradient(0 , 0 , 50 , 50 , colors , null , Shader.TileMode.REPEAT);// myView.paint.setShader(shader1); //将填充效果传入 myView.invalidate(); //重新绘制 } @Override public void onClick(View v) { } }
4.加上填充效果SweepGradient
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ MyView myView; private Matrix matrix = new Matrix(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myView = (MyView) findViewById(R.id.myviw);; /*WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); DisplayMetrics metrics = new DisplayMetrics(); display.getMetrics(metrics); float screenwidth = metrics.widthPixels; float screenhight = metrics.heightPixels; Bitmap bm = BitmapFactory.decodeResource(getResources() , R.drawable.ly); int width = bm.getWidth(); int height = bm.getHeight(); float scale = screenwidth/2/width; //显示图片的缩放比例 float scale2 = screenhight/2/height; matrix.setScale(scale , scale2); //将显示的图片缩放到屏幕大小 Bitmap bj = Bitmap.createBitmap(bm , 0 ,0 , width , height , matrix , true); Shader shader0 = new BitmapShader(bj , Shader.TileMode.REPEAT , Shader.TileMode.MIRROR); myView.paint.setShader(shader0); //将填充效果传入 myView.invalidate(); //重新绘制*/ /*int[] colors = new int[]{Color.RED , Color.GREEN , Color.BLUE}; Shader shader1 = new LinearGradient(0 , 0 , 50 , 50 , colors , null , Shader.TileMode.REPEAT);// myView.paint.setShader(shader1); //将填充效果传入 myView.invalidate(); //重新绘制*/ //***************************************************** int[] colors = new int[]{Color.RED , Color.GREEN , Color.BLUE}; Shader shader2 = new SweepGradient(160 , 160 , colors , null); //渲染中心x,y坐标,渲染颜色数组,相对位置的颜色数组可为null myView.paint.setShader(shader2); myView.invalidate(); } @Override public void onClick(View v) { } }
5.加上填充效果RadialGradient
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ MyView myView; private Matrix matrix = new Matrix(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myView = (MyView) findViewById(R.id.myviw);; /*WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); DisplayMetrics metrics = new DisplayMetrics(); display.getMetrics(metrics); float screenwidth = metrics.widthPixels; float screenhight = metrics.heightPixels; Bitmap bm = BitmapFactory.decodeResource(getResources() , R.drawable.ly); int width = bm.getWidth(); int height = bm.getHeight(); float scale = screenwidth/2/width; //显示图片的缩放比例 float scale2 = screenhight/2/height; matrix.setScale(scale , scale2); //将显示的图片缩放到屏幕大小 Bitmap bj = Bitmap.createBitmap(bm , 0 ,0 , width , height , matrix , true); Shader shader0 = new BitmapShader(bj , Shader.TileMode.REPEAT , Shader.TileMode.MIRROR); myView.paint.setShader(shader0); //将填充效果传入 myView.invalidate(); //重新绘制*/ /*int[] colors = new int[]{Color.RED , Color.GREEN , Color.BLUE}; Shader shader1 = new LinearGradient(0 , 0 , 50 , 50 , colors , null , Shader.TileMode.REPEAT);// myView.paint.setShader(shader1); //将填充效果传入 myView.invalidate(); //重新绘制*/ /*int[] colors = new int[]{Color.RED , Color.GREEN , Color.BLUE}; Shader shader2 = new SweepGradient(160 , 160 , colors , null); //渲染中心x,y坐标,渲染颜色数组,相对位置的颜色数组可为null myView.paint.setShader(shader2); myView.invalidate();*/ //***************************************************** int[] colors = new int[]{Color.RED , Color.GREEN , Color.BLUE}; Shader shader3 = new RadialGradient(100 , 100 , 80 , colors , null , Shader.TileMode.REPEAT); myView.paint.setShader(shader3); myView.invalidate(); } @Override public void onClick(View v) { } }
6.加上填充效果ComposeShader
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ MyView myView; private Matrix matrix = new Matrix(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myView = (MyView) findViewById(R.id.myviw);; WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); DisplayMetrics metrics = new DisplayMetrics(); display.getMetrics(metrics); float screenwidth = metrics.widthPixels; float screenhight = metrics.heightPixels; Bitmap bm = BitmapFactory.decodeResource(getResources() , R.drawable.ly); int width = bm.getWidth(); int height = bm.getHeight(); float scale = screenwidth/2/width; //显示图片的缩放比例 float scale2 = screenhight/2/height; matrix.setScale(scale , scale2); //将显示的图片缩放到屏幕大小 Bitmap bj = Bitmap.createBitmap(bm , 0 ,0 , width , height , matrix , true); Shader shader0 = new BitmapShader(bj , Shader.TileMode.REPEAT , Shader.TileMode.MIRROR); /*myView.paint.setShader(shader0); //将填充效果传入 myView.invalidate(); //重新绘制*/ int[] colors = new int[]{Color.RED , Color.GREEN , Color.BLUE}; Shader shader1 = new LinearGradient(0 , 0 , 50 , 50 , colors , null , Shader.TileMode.REPEAT);// /*myView.paint.setShader(shader1); //将填充效果传入 myView.invalidate(); //重新绘制*/ //int[] colors = new int[]{Color.RED , Color.GREEN , Color.BLUE}; Shader shader2 = new SweepGradient(160 , 160 , colors , null); //渲染中心x,y坐标,渲染颜色数组,相对位置的颜色数组可为null /*myView.paint.setShader(shader2); myView.invalidate();*/ //int[] colors = new int[]{Color.RED , Color.GREEN , Color.BLUE}; Shader shader3 = new RadialGradient(100 , 100 , 80 , colors , null , Shader.TileMode.REPEAT); /*myView.paint.setShader(shader3); myView.invalidate();*/ //组合效果 Shader shader4 = new ComposeShader(shader0 , shader3 , PorterDuff.Mode.DARKEN); myView.paint.setShader(shader4); //组合效果填充 myView.invalidate(); } @Override public void onClick(View v) { } }
简单介绍到此为止
至于
PorterDuff.Mode.DARKEN
可以到该网址查看 https://www.jianshu.com/p/d11892bbe055