package com.yarin.android.Examples_05_11; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ComposeShader; import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.RadialGradient; import android.graphics.Shader; import android.graphics.SweepGradient; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.OvalShape; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; public class GameView extends View implements Runnable { /* ����Bitmap���� */ Bitmap mBitQQ = null; int BitQQwidth = 0; int BitQQheight = 0; Paint mPaint = null; /* Bitmap��Ⱦ */ Shader mBitmapShader = null; /* ���Խ�����Ⱦ */ Shader mLinearGradient = null; /* �����Ⱦ */ Shader mComposeShader = null; /* ���ѽ�����Ⱦ */ Shader mRadialGradient = null; /* �ݶ���Ⱦ */ Shader mSweepGradient = null; ShapeDrawable mShapeDrawableQQ = null; public GameView(Context context) { super(context); /* װ����Դ */ mBitQQ = ((BitmapDrawable) getResources().getDrawable(R.drawable.qq)).getBitmap(); /* �õ�ͼƬ�Ŀ�Ⱥ͸߶� */ BitQQwidth = mBitQQ.getWidth(); BitQQheight = mBitQQ.getHeight(); /* ����BitmapShader���� */ mBitmapShader = new BitmapShader(mBitQQ,Shader.TileMode.REPEAT,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); /* ����������Ϊ�������Ⱦ��--��ҿ������Լ�����⣬�����������˼�ͺ�*/ mComposeShader = new ComposeShader(mBitmapShader,mLinearGradient,PorterDuff.Mode.DARKEN); /* ����RadialGradient�������ð뾶������ */ //����ʹ����BitmapShader��LinearGradient���л�� //��ȻҲ����ʹ����������� //�����Ⱦ��ģʽ�ܶ࣬���Ը����Լ���Ҫ��ѡ�� mRadialGradient = new RadialGradient(50,200,50, new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE}, null,Shader.TileMode.REPEAT); /* ����SweepGradient���� */ mSweepGradient = new SweepGradient(30,30,new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},null); mPaint = new Paint(); /* �����߳� */ new Thread(this).start(); } public void onDraw(Canvas canvas) { super.onDraw(canvas); //��ͼƬ�ü�Ϊ��Բ�� /* ����ShapeDrawable���󲢶�����״Ϊ��Բ */ mShapeDrawableQQ = new ShapeDrawable(new OvalShape()); /* ����Ҫ���Ƶ���Բ�εĶ���ΪShapeDrawableͼƬ */ mShapeDrawableQQ.getPaint().setShader(mBitmapShader); /* ������ʾ���� */ mShapeDrawableQQ.setBounds(0,0, BitQQwidth, BitQQheight); /* ����ShapeDrawableQQ */ mShapeDrawableQQ.draw(canvas); //���ƽ���ľ��� mPaint.setShader(mLinearGradient); canvas.drawRect(BitQQwidth, 0, 320, 156, mPaint); //��ʾ�����ȾЧ�� mPaint.setShader(mComposeShader); canvas.drawRect(0, 300, BitQQwidth, 300+BitQQheight, mPaint); //���ƻ��ν��� mPaint.setShader(mRadialGradient); canvas.drawCircle(50, 200, 50, mPaint); //�����ݶȽ��� mPaint.setShader(mSweepGradient); canvas.drawRect(150, 160, 300, 300, mPaint); } // �����¼� public boolean onTouchEvent(MotionEvent event) { return true; } // ���������¼� public boolean onKeyDown(int keyCode, KeyEvent event) { return true; } // ���������¼� public boolean onKeyUp(int keyCode, KeyEvent event) { return false; } public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) { return true; } /** * �̴߳��� */ public void run() { while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } //ʹ��postInvalidate����ֱ�����߳��и��½��� postInvalidate(); } } }