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.testimport 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了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)