【android imageview】Android实现ImageView阴影和图层效果

更新时间:2021-06-15    来源:php常用代码    手机版     字体:

【www.bbyears.com--php常用代码】

 代码如下

importandroid.app.Activity;

importandroid.content.Context;

importandroid.graphics.Bitmap;

importandroid.graphics.BitmapFactory;

importandroid.graphics.Canvas;

importandroid.graphics.Color;

importandroid.graphics.Paint;

importandroid.graphics.PorterDuff;

importandroid.graphics.PorterDuff.Mode;

importandroid.graphics.PorterDuffXfermode;

importandroid.graphics.Rect;

importandroid.graphics.RectF;

importandroid.graphics.drawable.Drawable;

importandroid.os.Bundle;

importandroid.view.View;

 

publicclassMyCanvasActivityextendsActivity {

 /** Called when the activity is first created. */

 @Override

 publicvoidonCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(newImageEffect(this));

 }

 

 classImageEffectextendsView{

  Paint paint;

  publicImageEffect(Context context){

   super(context);

   paint=newPaint();//初始化画笔,为后面阴影效果使用。 

   paint.setAntiAlias(true);//去除锯齿。 

   paint.setShadowLayer(5f,5.0f,5.0f, Color.BLACK);//设置阴影层,这是关键。 

   paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));

 

  }

  publicvoidonDraw(Canvas canvas){

   super.onDraw(canvas);

   intposX =20;

   intposY =50;

   intPicWidth,PicHeight;

 

  Drawable drawable = getResources().getDrawable(R.drawable.pic);

  Drawable dbe = getResources().getDrawable(R.drawable.pic).mutate();//如果不调用mutate方法,则原图也会被改变,因为调用的资源是同一个,所有对象是共享状态的。 

  Drawable drawTest = getResources().getDrawable(R.drawable.pic);

  Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic);

  PicWidth = drawable.getIntrinsicWidth();

  PicHeight = drawable.getIntrinsicHeight();

 

  drawTest.setBounds(posX, (2* posY) + PicHeight, posX + PicWidth, (2* posY) +2* PicHeight );

  drawable.setBounds(posX,posY,posX+PicWidth,posY+PicHeight);

  dbe.setBounds(0,0, PicWidth, PicHeight);

 

  canvas.drawColor(Color.WHITE);//设置画布颜色 

  canvas.save(Canvas.MATRIX_SAVE_FLAG);

  dbe.setColorFilter(0x7f000000,PorterDuff.Mode.SRC_IN);

  canvas.translate(posX + (int)(0.9* PicWidth/2), posY + PicHeight/2);//图像平移为了刚好在原图后形成影子效果。 

  canvas.skew(-0.9F,0.0F);//图像倾斜效果。 

  canvas.scale(1.0f,0.5f);//图像(其实是画布)缩放,Y方向缩小为1/2。 

  dbe.draw(canvas);//此处为画原图像影子效果图,比原图先画,则会在下层。 

  drawable.clearColorFilter();

  canvas.restore();

 

  canvas.save(Canvas.MATRIX_SAVE_FLAG);

  drawable.draw(canvas);//此处为画原图像,由于canvas有层次效果,因此会盖在影子之上。 

  canvas.restore();

 

  //默认无效果原图 

  canvas.save(Canvas.MATRIX_SAVE_FLAG);

  drawTest.draw(canvas);

  canvas.restore();

 

  //图片阴影效果 

  Rect rect =newRect(2*posX + PicWidth +3,2*posY + PicHeight +3,2*posX +2*PicWidth -2,2*posY +2*PicHeight -2);

  //由于图片的实际尺寸比显示出来的图像要大一些,因此需要适当更改下大小,以达到较好的效果 

 

  RectF rectF =newRectF(rect);

  canvas.drawRoundRect(rectF, 10f, 10f, paint);//在原有矩形基础上,画成圆角矩形,同时带有阴影层。 

  canvas.drawBitmap(bmp,2*posX + PicWidth,2*posY + PicHeight,null);//画上原图。 

  canvas.restore();

  }

 }

}

效果图:

本文来源:http://www.bbyears.com/jiaocheng/123972.html