android TextView、Button和ImageView阴影

最近在做项目,需要设置图片阴影,发现ImageView根本没有直接设置阴影的方法和属性,只能自己自定义。以下资源来源于网,整理下方便以后查看。

1. TextView、Button在代码中添加文字阴影

    mTextView.setShadowLayer(12f, 7F,8F, Color.RED); 第一个参数为模糊度,越大越模糊。 第二个参数是阴影离开文字的x横向距离。 第三个参数是阴影离开文字的Y横向距离。 第四个参数是阴影颜色。(如果模糊度为0是看不到阴影效果的)


2.在配置文件中添加文字阴影

<TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_marginBottom="5.0dip"
            android:layout_marginLeft="10.0dip"
            android:shadowColor="@color/black"
            android:shadowDx="1"
            android:shadowDy="1"
            android:shadowRadius="10"
            android:textSize="16dp" />

android:shadowColor 阴影的颜色

android:shadowDx 阴影的水平偏移量

android:shadowDy 阴影的垂直偏移量

android:shadowRadius 阴影的范围

需要注意的地方 :将android:shadowRadius=0 的时候是看不到阴影的


Button类似。


3.简单的图片阴影

      利用BlurMaskFilter进行处理, BlurMaskFilter指定了一个模糊的样式和半径来处理Paint的边缘。

public class ButtonShadow extends Button {
private Bitmap mBmp;
private Paint mPaint;


public ButtonShadow(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs,new int[]{android.R.attr.background});
mBmp = BitmapFactory.decodeResource(context.getResources(), a.getResourceId(0, R.drawable.ic_launcher));
setBackgroundDrawable(null);
init(context);
}

private void init(Context context){
mPaint = new Paint();
BlurMaskFilter bf = new BlurMaskFilter(20,BlurMaskFilter.Blur.INNER);
mPaint.setColor(context.getResources().getColor(R.color.gray));
mPaint.setMaskFilter(bf);
}

public void setBitmap(Bitmap bm) {
mBmp = bm;
invalidate();
}

@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(mBmp.extractAlpha(mPaint, null), 0, 
10, mPaint);
canvas.drawBitmap(mBmp,0,0,null);
}
}

4.自定义图片

  1. class ImageEffect extends View{  
  2.       Paint paint;  
  3.      public ImageEffect(Context context){  
  4.          super(context);  
  5.          paint= new Paint(); //初始化画笔,为后面阴影效果使用。   
  6.          paint.setAntiAlias(true);//去除锯齿。   
  7.          paint.setShadowLayer(5f, 5.0f, 5.0f, Color.BLACK); //设置阴影层,这是关键。   
  8.          paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
  9.            
  10.      }  
  11.      public void onDraw(Canvas canvas){  
  12.          super.onDraw(canvas);  
  13.          int posX  = 20;  
  14.          int posY = 50;  
  15.          int PicWidth,PicHeight;  
  16.            
  17.         Drawable drawable = getResources().getDrawable(R.drawable.pic);  
  18.         Drawable dbe    = getResources().getDrawable(R.drawable.pic).mutate();//如果不调用mutate方法,则原图也会被改变,因为调用的资源是同一个,所有对象是共享状态的。   
  19.         Drawable drawTest = getResources().getDrawable(R.drawable.pic);  
  20.         Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic);  
  21.         PicWidth = drawable.getIntrinsicWidth();  
  22.         PicHeight = drawable.getIntrinsicHeight();  
  23.           
  24.         drawTest.setBounds(posX, (2 * posY) + PicHeight, posX + PicWidth, (2 * posY) + 2 * PicHeight );  
  25.         drawable.setBounds(posX,posY,posX+PicWidth,posY+PicHeight);  
  26.         dbe.setBounds(00, PicWidth, PicHeight);  
  27.           
  28.         canvas.drawColor(Color.WHITE);//设置画布颜色   
  29.         canvas.save(Canvas.MATRIX_SAVE_FLAG);  
  30.         dbe.setColorFilter(0x7f000000,PorterDuff.Mode.SRC_IN);  
  31.         canvas.translate(posX + (int)(0.9 * PicWidth/2), posY + PicHeight/2);//图像平移为了刚好在原图后形成影子效果。   
  32.         canvas.skew(-0.9F, 0.0F);//图像倾斜效果。   
  33.         canvas.scale(1.0f, 0.5f);//图像(其实是画布)缩放,Y方向缩小为1/2。   
  34.         dbe.draw(canvas);//此处为画原图像影子效果图,比原图先画,则会在下层。   
  35.         drawable.clearColorFilter();  
  36.         canvas.restore();  
  37.           
  38.        canvas.save(Canvas.MATRIX_SAVE_FLAG);  
  39.         drawable.draw(canvas);
  40.         canvas.restore();         
  41.       
  42.         }  
  43.   }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值