android shape图怎么做阴影

android shape图怎么做阴影,第1张

使用layer-list ! 直接上代码如下:

android学习手册里面有关于shape的详细例子,直接可以看源码,如果您相信的话可以去看看。

android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行, 源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,图标上有贝壳

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<item>

<shape android:shape="rectangle">

<solid android:color="#792a03" />

<corners android:radius="19dp" />

</shape>

</item>

<item android:top="1px">

<shape android:shape="rectangle">

<gradient android:startColor="#ffdb8f" android:endColor="#ffdb8f"

android:angle="270" />

<padding android:left="5dp" android:top="3dp" android:right="5dp"

android:bottom="3dp" />

<corners android:radius="20dp" />

</shape>

</item>

</layer-list>

将以上xml存成btn_test, 放到res/drawable/目录下。 将该drawable xml设为一个TextView的backgroiund,

<TextView

android:background="@drawable/btn_test"

android:layout_marginTop="20dip"

android:layout_marginLeft="5dip"

android:textColor="#792a03"

android:text="1天2小时14分20秒"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

Android实现纯java代码字体阴影效果,主要是通过activity的draw方法,进行重新绘制,如下代码:

package canvas.test

import android.app.Activity

import android.os.Bundle

import android.content.Context

import android.graphics.Bitmap

import android.graphics.BitmapFactory

import android.graphics.Canvas

import android.graphics.Color

import android.graphics.Paint

import android.graphics.PorterDuff

import android.graphics.PorterDuff.Mode

import android.graphics.PorterDuffXfermode

import android.graphics.Rect

import android.graphics.RectF

import android.graphics.drawable.Drawable

import android.view.View

public class ShaderEffect extends Activity {

  @Override

  public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState)

    setContentView(new ImageEffect(this))

  }

  class ImageEffect extends View{

    Paint paint 

    public ImageEffect (Context context){

      super(context)

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

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

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

      paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN))

    }

    @Override

    public void onDraw(Canvas canvas){

      super.onDraw(canvas)

      int posX = 20

      int posY = 50

      int PicWidth,PicHegiht 

      Drawable drawable = getResources().getDrawable(R.drawable.button)

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

      Drawable drawTest = getResources().getDrawable(R.drawable.button)

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

      PicWidth = drawable.getIntrinsicWidth()

      PicHegiht = drawable.getIntrinsicHeight()

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

      drawable.setBounds(posX,posY,posX+PicWidth,posY+PicHegiht)

      dbe.setBounds(0, 0, PicWidth, PicHegiht)

      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 + PicHegiht/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()

      //图片阴影效果

      canvas.save(Canvas.MATRIX_SAVE_FLAG)

      //Rect rect = new Rect(2*posX + PicWidth, 2*posY + PicHegiht, 2*posX + 2*PicWidth, 2*posY + 2*PicHegiht)//此为理论上的阴影图坐标

      Rect rect = new Rect(2*posX + PicWidth + 3, 2*posY + PicHegiht + 3, 2*posX + 2*PicWidth - 2, 2*posY + 2*PicHegiht - 2)

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

      RectF rectF = new RectF(rect)

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

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

      canvas.restore()

    }

  }

}

在安卓开发中,有时UI设计师需要给某个东西加个阴影。安卓里自带了Cardview,能实现下面这样的效果。

Cardview提供了阴影效果,但是存在两个问题:

1、无法修改阴影颜色

2、无法修改投影方向(Cardview的投影是从上往下投影的)

网上有人做了其他开源库来改变投影颜色和投影方向,但是效果都不太好,甚是苦恼。

后来在同事提醒下,才发现,其实根本就不复杂,用个点九图就可以了。

让美工做个带阴影的边框图,然后自己在AndroidStudio里做成点九图,拿这个做背景图就ok了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11573945.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存