[MickleZcg]
http://bbs.ldci.com.cn/simple/?t3094.html
ShapeDrawable放大镜的案例
放大镜的案例
如果要在圆形区域放大,一种解决的办法是切出圆形的图在放大。一种是最好能够有设定任意形状的可显示区域,找了老半天也没找到。
觉得要动用C的CGI技术的时候,我想到了ShapeDrawable,ShapeDrawable是可以设置画的形状的。但不知道他有没有可以设置要画的像素组,查了一下,真是惊喜万分啊。shape.getPaint().setShader()可以设置 Shader,Shader可以接受一个图像的数据,通过BitmapShader(Bitmap, Shader.TileMode.REPEAT,
Shader.TileMode.REPEAT);可以得到Shader,通过这两个方法我实现了在圆形区域显示图像的要求
现在贡献我的代码
- package com.ui;
- import android.view.KeyEvent;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.View;
- import android.graphics.Matrix;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Bitmap;
- import android.graphics.Paint;
- import android.graphics.Paint.Style;
- import android.graphics.Region;
- import android.graphics.Rect;
- import com.util.Tools;
- import android.graphics.drawable.PaintDrawable;
- import android.util.Log;
- import com.main.main;
- import com.main.R;
- import android.graphics.MaskFilter;
- import android.graphics.EmbossMaskFilter;
- import android.graphics.Path;
- import android.graphics.BlurMaskFilter;
- import android.graphics.BitmapFactory;
- import android.graphics.RectF;
- import android.graphics.drawable.ShapeDrawable;
- import android.graphics.drawable.ShapeDrawable.ShaderFactory;
- import android.graphics.drawable.shapes.Shape;
- import android.graphics.drawable.shapes.OvalShape;
- import android.graphics.BitmapShader;
- import android.graphics.Shader;
- public class FaceView extends View
- {
- private float rectx=20;
- private float recty=20;
- private Bitmap bmp[]=new Bitmap[1];
- private Bitmap fp=null;
- private Bitmap bmp2=null;
- private Bitmap tmp[]=new Bitmap[1];
- private EmbossMaskFilter filter=null;
- protected static final String ACTIVITY_TAG="FaceView";
- private float fangda=1;
- private float dushu[]=new float[]{0,30,60,90};
- private int index=0;
- private int peishu=1;
- private boolean isfandasuoxiao=true;
- private main main=null;
- public void setMain(main main) {
- this.main = main;
- //this.getContext().
- }
- // private Matrix rx=null;
- Paint p;
- // private ShapeDrawable drawable =null;
- public FaceView(android.content.Context context){
- super(context);
- // context.c
- // this.c.
- // context.deleteDatabase(arg0)
- //context.openOrCreateDatabase(arg0, arg1, arg2)
- p=new Paint();
- p.setColor(-1);
- // context.
- fp=BitmapFactory.decodeResource( this.getResources(), R.drawable.fd);
- //p.setMaskFilter(maskfilter)
- // p.
- //rx = new Matrix();
- // setLongClickable(true);
- // this.setOnTouchListener(this);
- // RectShape r= new RectShape() ;
- //=new ShapeDrawable(new RectShape() );
- //.getPaint().setColor(-1);
- }
- public Bitmap makeDst(int w, int h) {
- Bitmap bmy =this.bmp2;
- Paint py = new Paint(Paint.ANTI_ALIAS_FLAG);
- Canvas c = new Canvas(bmy);
- py.setColor(-1);
- py.setStyle(Style.STROKE);
- py.setAlpha(50);
- c.drawOval(new RectF(0, 0, this.bmp2.getWidth()*3/4, this.bmp2.getHeight()*3/4), py);
- c.setBitmap(bmy);
- return bmy;
- }
- private Shader makeTiling() {
- return new BitmapShader(this.bmp2, Shader.TileMode.REPEAT,
- Shader.TileMode.REPEAT);
- }
- public ShapeDrawable drawbmp(){
- ShapeDrawable shape=new ShapeDrawable(new OvalShape());
- shape.getPaint().setShader(makeTiling());
- return shape;
- }
- public void setBitmap(Bitmap bmp) {
- this.bmp[0]=bmp;
- System.arraycopy(this.bmp,0 ,this.tmp , 0, 1);
- fangda=1;
- // dushu=0;
- peishu=1;
- // chang_Bmp();
- }
- @Override
- protected void onDraw(Canvas canvas) {
- // TODO Auto-generated method stub
- p.setStyle(Style.STROKE);
- //p.
- //.d
- if(this.bmp[0]!=null){
- canvas.drawBitmap(this.bmp[0], 0, 0, new Paint());
- Rect oldrect=canvas.getClipBounds();
- //canvas.clipRegion(region)
- canvas.drawText("放大", 2, this.getHeight()-30, p);
- canvas.drawText("缩小", 80, this.getHeight()-30, p);
- canvas.drawText("旋转", 150, this.getHeight()-30, p);
- canvas.drawText("退出", this.getWidth()-40, this.getHeight()-30, p);
- //canvas.
- if(bmp2!=null){
- // canvas.clipRect(rectx, recty, rectx+180, recty+180, Op.DIFFERENCE);
- //canvas.
- //canvas.d
- //canvas.clipRegion(region)
- //this.bmp2.extractAlpha(pt, new int[]{(int)rectx+50,(int)recty+50});
- //canvas.drawBitmap(drawbmp(), rectx+8, recty+8, new Paint());
- ShapeDrawable sha= drawbmp();
- sha.setBounds((int)rectx, (int)recty, (int)rectx+fp.getWidth(), (int)recty+fp.getWidth());
- sha.draw(canvas);
- //canvas.drawVertices(mode, vertexCount, verts, vertOffset, texs, texOffset, colors, colorOffset, indices, indexOffset, indexCount, paint)
- //.drawBitmap(this.bmp2, rectx, recty, new Paint());
- //canvas.drawBitmapMesh(bitmap, meshWidth, meshHeight, verts, vertOffset, colors, colorOffset, paint)
- }
- float[] tempArr={200,10,100};
- Paint tp=new Paint();
- tp.setStyle(Style.STROKE);
- tp.setColor(-1);
- tp.setAlpha(100);
- EmbossMaskFilter emm =new EmbossMaskFilter(tempArr,0.5f,100,10.5f);
- tp.setMaskFilter(emm);
- // tp.
- //canvas.drawRect(rectx, , (rectx+180)*3/4, (recty+180)*3/4, tp);
- canvas.drawCircle(rectx+fp.getWidth()/2, recty+fp.getWidth()/2, fp.getWidth()/2,tp);
- canvas.drawBitmap(this.fp, rectx, recty, new Paint());
- //canvas.c
- //canvas.drawBitmapMesh(bitmap, meshWidth, meshHeight, verts, vertOffset, colors, colorOffset, paint)
- // canvas.drawBitmap(makeDst(50,50), 10,10,new Paint());
- //canvas.drawBitmap(fp, rectx, recty, new Paint());
- //canvas.drawRect(rectx, recty, rectx+180, recty+180, p);
- //canvas.drawRect(rectx+2, recty+2, rectx+180-2, recty+180-2, p);
- // canvas.clipRect(oldrect);
- }
- //canvas.
- //drawable.setBounds(20, 20, 250, 250);
- //drawable.draw(canvas);
- //p.
- }
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- // TODO Auto-generated method stub
- return super.onKeyDown(keyCode, event);
- }
- @Override
- public boolean onKeyUp(int keyCode, KeyEvent event) {
- // TODO Auto-generated method stub
- return super.onKeyUp(keyCode, event);
- }
- @Override
- public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
- // TODO Auto-generated method stub
- return super.onKeyMultiple(keyCode, repeatCount, event);
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- switch(event.getAction()){
- case MotionEvent.ACTION_DOWN:
- if( event.getY()<this.getHeight()-40 ){
- this.rectx=event.getX();
- this.recty=event.getY()-15;
- if(this.rectx+180>=this.bmp[0].getWidth()){
- this.rectx= this.bmp[0].getWidth()-180;
- }
- if(this.recty+180>=this.bmp[0].getHeight()){
- this.recty=this.bmp[0].getHeight()-180;
- }
- chang_Bmp();
- //this.bmp2=Tools.effect_cut(bmp3, ((int)this.rectx* (int)this.fangda+2), ((int)this.recty* (int)this.fangda+2), 100-2, 100-2);
- Log.i(FaceView.ACTIVITY_TAG, "msg"+this.rectx);}else{
- if(event.getRawX()>=2 && event.getRawX()<=40 && event.getRawY()<this.getHeight() && event.getRawY()>=this.getHeight()-40 ){
- isfandasuoxiao=true;
- if(this.fangda>=1){
- this.peishu++;
- if(this.peishu>=5){
- this.peishu=5;
- }
- this.fangda=1*(float)this.peishu;}else{
- this.peishu--;
- if(this.peishu<=1){
- this.peishu=1;
- }
- this.fangda=1/(float)this.peishu;
- }
- chang_Bmp();
- }else if(event.getRawX()>=80 && event.getRawX()<=80+40 && event.getRawY()<this.getHeight() && event.getRawY()>=this.getHeight()-40){
- isfandasuoxiao=false;
- if(this.fangda>1){
- this.peishu--;
- if(this.peishu<=1){
- this.peishu=1;
- }
- this.fangda=1*(float)this.peishu;}
- chang_Bmp();
- }else if(event.getRawX()>=150 && event.getRawX()<=150+40 && event.getRawY()<this.getHeight() && event.getRawY()>=this.getHeight()-40){
- index++;
- Matrix rx = new Matrix();
- this.bmp2=null;
- if(this.index>this.dushu.length-1){
- this.index=0;
- System.arraycopy(this.tmp,0 ,this.bmp , 0, 1);
- }else{
- rx.postRotate(this.dushu[this.index]);
- bmp[0]=Bitmap.createBitmap(bmp[0], 0, 0, bmp[0].getWidth(), bmp[0].getHeight(), rx, true);
- }
- //rx.p
- //Bitmap bmp3=Tools.effect_cut(bmp1[0], ((int)this.rectx+2), ((int)this.recty+2), 100-2, 100-2);//切图片ue
- }else if(event.getRawX()>=this.getWidth()-40 && event.getRawX()<=this.getWidth() && event.getRawY()<this.getHeight() && event.getRawY()>=this.getHeight()-40){
- this.main.finish();
- }
- }
- this.postInvalidate();
- break;
- }
- return super.onTouchEvent(event);
- }
- public void chang_Bmp(){
- Bitmap bmp1[]=new Bitmap[1];
- System.arraycopy(bmp,0 ,bmp1 , 0, 1);
- if(this.fangda>0){
- Matrix rx = new Matrix();
- rx.postScale(this.fangda, this.fangda);
- //rx.postSkew(0, 10, 5, 6);
- //Bitmap bmp3=Tools.effect_cut(bmp1[0], ((int)this.rectx+2), ((int)this.recty+2), 100-2, 100-2);//切图片ue
- Bitmap bmp3=Bitmap.createBitmap(bmp1[0], 0, 0, bmp1[0].getWidth(), bmp1[0].getHeight(),rx,true);
- //Bitmap.
- this.bmp2=Bitmap.createBitmap(bmp3, (int)this.rectx*this.peishu, (int)this.recty*this.peishu, fp.getWidth(), fp.getWidth());
- //this.bmp2=Tools.effect_hoodwink(this.bmp2);
- }else{
- Bitmap bmp3=Tools.effect_resizeImage(bmp1[0], bmp1[0].getWidth()/this.peishu, bmp1[0].getHeight()/this.peishu);
- this.bmp2=Bitmap.createBitmap(bmp3, ((int)this.rectx/ (int)this.peishu+2), ((int)this.recty/(int)this.peishu+2), fp.getWidth(), fp.getWidth());
- this.bmp2=Tools.effect_hoodwink(this.bmp2);
- }
- }
- @Override
- public boolean onKeyShortcut(int keyCode, KeyEvent event) {
- // TODO Auto-generated method stub
- return super.onKeyShortcut(keyCode, event);
- }
- public boolean onDown(MotionEvent e) {
- // TODO Auto-generated method stub
- return false;
- }
- }