Paint的填充效果shader的使用

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


猜你喜欢

转载自blog.csdn.net/qq_38261174/article/details/80044674