Paint API - Shader (penyampaian imej)
1. Penjelasan terperinci tentang kaedah pembinaan
1)BitmapShader (penyediaan imej)
BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader .TileMode tileY )
Gunakan bitmap sebagai tekstur untuk mengisi kawasan tertentu, parameternya ialah:
- bitmap: digunakan Sebagai bitmap pengisian;
- tileX: bentuk sambungan bitmap dalam arah paksi-X; dalam Borang arah paksi-Y;
- Dan Shader.TileMode ini mempunyai tiga jenis:
CLAMP
bermakna jika pemapar melebihi yang asal julat sempadan, pasangan warna tepi akan disalin Mewarna kawasan di luar julat
- ULANG diulang pemaparan dalam bentuk jubin
- CERMIN dicerminkan secara mendatar dan menegak Berulang kali memberikan peta bit.
- 2) ComposeShader (rendering bercampur)
ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mod)
Tindanan kesan pemaparan, anda tahu apa itu apabila anda melihat PorterDuff, bukan? Sebagai contoh, pemaparan campuran BitmapShader dan LinearGradient Kesan dsb. Parameter adalah mengikut urutan:
shaderA
: kesan pemaparan pertama
- shaderB: kesan pemaparan kedua
- mod: Mod tindanan dua kesan pemaparan
- 3) LinearGradient (linear rendering)
LinearGradient(float x0 , float y0, float x1, float y1, warna int[], kedudukan float[], jubin Shader.TileMode);
Mencapai kesan kecerunan linear warna dalam kawasan tertentu, parameter Dalam susunan:
x0
: x koordinat titik permulaan kecerunan
- y0: y koordinat titik permulaan bagi kecerunan
- x1: Titik akhir x koordinat kecerunan
- y1: Titik akhir y koordinat kecerunan
- warna: Tatasusunan Warna kecerunan
- kedudukan: kedudukan relatif tatasusunan warna
- jubin: kaedah jubin
- 4)RadialGradient (ring rendering)
public RadialGradient (float x, float y, float radius, int[] warna, float[ ] kedudukan, jubin Shader.TileMode);
Untuk mencapai kesan kecerunan bulat warna di kawasan tertentu, parameternya ialah:
x
: x koordinat pusat gelang
- y: Koordinat y pusat gelang
- jejari: Jejari cincin
- warna: Warna Tatasusunan kecerunan cincin
- kedudukan: Tentukan kedudukan relatif tatasusunan warna
- jubin: Kaedah jubin
- 5) SweepGradient (rendering gradien)
SweepGradient awam (float cx , float cy, warna int[], kedudukan apungan[])
Paparan pengimbasan ialah kesan yang terbentuk dengan memutarkan pusat titik tertentu untuk satu revolusi! Parameternya ialah:
- cx: Pusat x koordinat imbasan
- cy: Pusat y koordinat imbasan
- warna: Tatasusunan warna kecerunan kecerunan
- kedudukan: Nyatakan kedudukan relatif tatasusunan warna
Mungkin dari teks yang kita boleh saya tahu fungsi kasar fungsi sepadan mereka, tetapi kita masih menulis kod. Sahkan peranan mereka, adakah kod (gambar) mempunyai kebenaran~
2 Gunakan contoh kod:
Jalankan rendering :
Kod pelaksanaan:
BitmapShaderView.java:
/** * Created by Jay on 2015/11/4 0030. */ public class BitmapShaderView extends View { private Bitmap mBitmap = null; private ShapeDrawable sDrawable = null; private Paint mPaint = null; private int bitW = 0, bitH = 0; //Bitmap宽高 private Shader mBitmapShader = null; //Bitmap渲染 private Shader mLinearGradient = null; //线性渐变渲染 private Shader mComposeShader = null; //混合渲染 private Shader mRadialGradient = null; //环形渐变渲染 private Shader mSweepGradient = null; //梯度渲染 public BitmapShaderView(Context context) { this(context, null); } public BitmapShaderView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public BitmapShaderView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } private void init() { mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.img_cat); bitW = mBitmap.getWidth(); bitH = mBitmap.getHeight(); mPaint = new Paint(); //创建BitmapShader mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR); //创建LinearGradient并设置渐变的颜色数组 mLinearGradient = new LinearGradient(0, 0, 100, 100, new int[]{Color.RED, Color.GREEN, Color.BLUE, Color.WHITE}, null, Shader.TileMode.REPEAT); //混合渲染,这里使用了BitmapShader和LinearGradient进行混合,可以试试其他~ mComposeShader = new ComposeShader(mBitmapShader, mLinearGradient, PorterDuff.Mode.DARKEN); //环形渐变渲染 mRadialGradient = new RadialGradient(50, 200, 50, new int[]{Color.GREEN, Color.RED, Color.BLUE, Color.WHITE}, null, Shader.TileMode.REPEAT); //梯度渲染 mSweepGradient = new SweepGradient(30, 30, new int[]{Color.GREEN, Color.RED, Color.BLUE, Color.WHITE}, null); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //将图片裁剪为椭圆形 sDrawable = new ShapeDrawable(new OvalShape()); sDrawable.getPaint().setShader(mBitmapShader); sDrawable.setBounds(0, 0, bitW, bitH); sDrawable.draw(canvas); //绘制线性渐变的矩形 mPaint.setShader(mLinearGradient); canvas.drawRect(bitW, 0, bitW * 2, bitH, mPaint); //绘制混合渲染效果 mPaint.setShader(mComposeShader); canvas.drawRect(0, bitH, bitW , bitH * 2, mPaint); //绘制环形渐变 mPaint.setShader(mRadialGradient); canvas.drawCircle(bitW * 2.8f, bitH / 2, bitH / 2, mPaint); //绘制梯度渐变 mPaint.setShader(mSweepGradient); canvas.drawRect(bitW, bitH, bitW * 2, bitH * 2, mPaint); } }
Itu seratus Jom jalankan kod itu. Tidak perlu menjelaskannya. Jika anda berasa keliru, cuba sahaja~
3. Muat turun kod untuk bahagian ini:
Ringkasan bahagian ini:
Bahagian ini memperkenalkan anda kepada API Paint yang lain: Shader (penyampaian imej), yang menambahkan jenis berus lain ke Pilihan kami~ Jika anda mempunyai keraguan apabila anda melihat kod dan tidak tahu cara menampal kod dan menukar parameter, anda akan faham~ Okey, itu sahaja untuk bahagian ini, terima kasih~