Android 如何在圆形imageview周围添加阴影
我想在圆形imageView周围添加阴影。 这是我的密码。 我想拍一张像这样的照片 这是我的.xml文件 检查此图像。 activity_main.xmlAndroid 如何在圆形imageview周围添加阴影,android,xml,Android,Xml,我想在圆形imageView周围添加阴影。 这是我的密码。 我想拍一张像这样的照片 这是我的.xml文件 检查此图像。 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <RelativeL
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:id="@+id/layoutTop"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="#355482" >
</RelativeLayout>
<RelativeLayout
android:id="@+id/layoutBottom"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_alignParentBottom="true"
android:layout_below="@+id/layoutTop"
android:background="@drawable/loading" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="113dp"
android:text="Profile"
android:textColor="#355482"
android:textSize="20dp"
android:textStyle="bold" />
</RelativeLayout>
<ImageView
android:id="@+id/overlapImage"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="132dp"
android:adjustViewBounds="true"
android:background="@drawable/round_image"
android:src="@drawable/ic_launcher" />
这是round_image.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#ffffff" />
<corners android:radius="2dp"/>
<size
android:height="80dp"
android:width="80dp" />
<padding
android:bottom="0dp"
android:left="0dp"
android:right="0dp"
android:top="0dp" />
</shape>
我尝试了一些阴影效果代码,但它不起作用。在回答之前,我想给出一些建议。你只需要把你的问题的标题放在谷歌上。我试着像这样搜索: 不使用图书馆: 更改
android:color=“#BDBDBD”
中的形状标记。
您的round_image.xml
如下所示:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#BDBDBD" />
<corners android:radius="2dp"/>
<size
android:height="80dp"
android:width="80dp" />
<padding
android:bottom="0dp"
android:left="0dp"
android:right="0dp"
android:top="0dp" />
</shape>
使用图书馆:
你试过这个吗
您可以使用此库,或者如果不想使用,可以从该库的内部res文件夹中获取一些代码
谢谢。希望这对您有所帮助:)
//背景色
根据需要更改背景颜色和阴影颜色。此类是具有阴影、笔划、饱和度的自定义圆形图像视图,使用此自定义圆形图像视图,您可以使图像成为具有半径的圆形。圆形阴影ImageView的家伙们不需要Github这个类就足够了。将CircularImageView动态添加到根布局。
*将圆形图像视图动态添加到布局*
RelativeLayout rootLayout=(RelativeLayout)findViewById(R.id.rootLayout);
addView(新的CircularImageView(this,200200,imageBitmap));
公共CircularImageView(上下文上下文、整数宽度、整数高度、位图){
超级(上下文);
this.context=上下文;
这个。宽度=宽度;
高度=高度;
------>这里的“位图”是方形(宽度*宽度)缩放位图。。
this.bitmap=位图;
油漆=新油漆(油漆.防油漆别名标志);
paint.setAntiAlias(真);
paint.setFilterBitmap(真);
绘制。设置抖动(真);
油漆3=新油漆();
paint3.setStyle(Paint.Style.STROKE);
油漆3.setColor(颜色:白色);
paint3.setantialas(真);
paintBorder=新绘制();
imagePaint=新油漆();
paintBorder.setColor(Color.WHITE);
paintBorder.setAntiAlias(true);
此.setLayerType(LAYER_TYPE_软件,paintBorder);
this.bitmap2=Bitmap.createScaledBitmap(位图,(Bitmap.getWidth()-40),(Bitmap.getHeight()-40),true);
imagePaint.setAntiAlias(真);
使无效();
}
@凌驾
受保护的void onDraw(画布)
{
super.onDraw(帆布);
着色器b;
如果(位图3!=null)
b=新的位图着色器(位图3,Shader.TileMode.CLAMP,Shader.TileMode.CLAMP);
其他的
b=新的位图着色器(位图2,Shader.TileMode.CLAMP,Shader.TileMode.CLAMP);
imagePaint.setShader(b);
drawBitmap(maskedBitmap(),20,20,null);
}
私有位图maskedBitmap()
{
位图l1=Bitmap.createBitmap(宽度、宽度、Bitmap.Config.ARGB_8888);
画布=新画布(l1);
paintBorder.setShadowLayer(半径,x,y,Color.parseColor(“#454645”);
setXfermode(新的PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
final RectF rect=新RectF();
rect.set(20,20,bitmap2.getWidth(),bitmap2.getHeight());
canvas.drawRoundRect(rect、角半径、角半径、画框);
canvas.drawRoundRect(rect、拐角半径、拐角半径、imagePaint);
如果(冲程宽度!=0.0f)
{
油漆3.设置冲程宽度(冲程宽度);
canvas.drawRoundRect(rect,角半径,角半径,paint3);
}
paint.setXfermode(null);
返回l1;
}
------>在这里使用seekbar,这里你必须通过“0--250”,这里的角半径会改变。。
公共空间设置角半径(内部角半径)
{
这个。拐角半径=拐角半径;
使无效();
}
-------->在这里使用seekbar,这里你必须通过“0--10.0f”,这里阴影半径会改变
公共空间设置阴影(浮动半径)
{
这个半径=半径;
使无效();
}
---->在这里使用seekbar,这里你必须通过“0--10.0f”,这里笔划大小将改变
公共无效设定行程(浮动行程)
{
这个.strokeWidth=笔划;
使无效();
}
专用位图更新SAT(位图src、浮点设置SAT)
{
int w=src.getWidth();
int h=src.getHeight();
位图位图结果=
createBitmap(w,h,Bitmap.Config.ARGB_8888);
Canvas canvasResult=新画布(位图结果);
油漆=新油漆();
ColorMatrix ColorMatrix=新的ColorMatrix();
颜色矩阵。设置饱和度(设置SAT);
ColorMatrixColorFilter过滤器=新的ColorMatrixColorFilter(colorMatrix);
油漆。设置颜色过滤器(过滤器);
canvasResult.drawBitmap(src,0,0,paint);
返回位图结果;
}
-------->在这里使用seekbar,这里你必须通过“0--2.0f”,这里饱和度会改变
公共空间饱和(浮动饱和)
{
System.out.println(“QQQQ”+sat);
bitmap3=更新sat(bitmap2,sat);
使无效();
}
}
-------->Seekbar可更改半径
radius_seekbar.setOnSeekbarchaneListener(新seekbar.onSeekbarchaneListener()的名称){
@凌驾
public void onProgressChanged(SeekBar-SeekBar、int-progress、boolean-fromUser)
{
text_radius.setText(“+progress”);
circularImageView.setCornerRadius(进度);
}
@凌驾
开始跟踪触摸时的公共无效(SeekBar SeekBar){
}
@凌驾
TopTrackingTouch(SeekBar SeekBar)上的公共无效{
}
});
//Seekbar改变阴影
shadow_seekbar.setonseekbarchaneglistener(新seekbar.onseekbarchaneglistener(){
@凌驾
public void onProgressChanged(SeekBar-SeekBar、int-progress、boolean-fromUser)
{
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="@color/gray"/>
<!--shadow Color-->
</shape>
</item>
<item
android:left="0dp"
android:right="0dp"
android:top="0dp"
android:bottom="3dp">
<shape android:shape="oval">
<solid android:color="@color/lightgrey"/>//Background Color
</shape>
</item>
</layer-list>
*Adding Circular ImageView to your layout dynamically*
RelativeLayout rootLayout= (RelativeLayout) findViewById(R.id.rootLayout);
rootLayout.addView(new CircularImageView(this,200,200,imageBitmap));
public CircularImageView(Context context, int width, int height, Bitmap bitmap) {
super(context);
this.context = context;
this.width = width;
this.height = height;
------> here "bitmap" is the square shape(width* width) scaled bitmap ..
this.bitmap = bitmap;
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
paint3=new Paint();
paint3.setStyle(Paint.Style.STROKE);
paint3.setColor(Color.WHITE);
paint3.setAntiAlias(true);
paintBorder = new Paint();
imagePaint= new Paint();
paintBorder.setColor(Color.WHITE);
paintBorder.setAntiAlias(true);
this.setLayerType(LAYER_TYPE_SOFTWARE, paintBorder);
this.bitmap2 = Bitmap.createScaledBitmap(bitmap, (bitmap.getWidth() - 40), (bitmap.getHeight() - 40), true);
imagePaint.setAntiAlias(true);
invalidate();
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
Shader b;
if (bitmap3 != null)
b = new BitmapShader(bitmap3, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
else
b = new BitmapShader(bitmap2, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
imagePaint.setShader(b);
canvas.drawBitmap(maskedBitmap(), 20, 20, null);
}
private Bitmap maskedBitmap()
{
Bitmap l1 = Bitmap.createBitmap(width,width, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(l1);
paintBorder.setShadowLayer(radius, x, y, Color.parseColor("#454645"));
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
final RectF rect = new RectF();
rect.set(20, 20, bitmap2.getWidth(), bitmap2.getHeight());
canvas.drawRoundRect(rect, corner_radius, corner_radius, paintBorder);
canvas.drawRoundRect(rect, corner_radius, corner_radius, imagePaint);
if (strokeWidth!=0.0f)
{
paint3.setStrokeWidth(strokeWidth);
canvas.drawRoundRect(rect, corner_radius, corner_radius, paint3);
}
paint.setXfermode(null);
return l1;
}
------> use seekbar here, here you have to pass "0 -- 250" here corner radius will change ..
public void setCornerRadius(int corner_radius)
{
this.corner_radius = corner_radius;
invalidate();
}
-------->use seekbar here, here you have to pass "0 -- 10.0f" here shadow radius will change
public void setShadow(float radius)
{
this.radius = radius;
invalidate();
}
----> use seekbar here, here you have to pass "0 -- 10.0f" here stroke size will change
public void setStroke(float stroke)
{
this.strokeWidth = stroke;
invalidate();
}
private Bitmap updateSat(Bitmap src, float settingSat)
{
int w = src.getWidth();
int h = src.getHeight();
Bitmap bitmapResult =
Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas canvasResult = new Canvas(bitmapResult);
Paint paint = new Paint();
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.setSaturation(settingSat);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(colorMatrix);
paint.setColorFilter(filter);
canvasResult.drawBitmap(src, 0, 0, paint);
return bitmapResult;
}
--------> use seekbar here, here you have to pass "0 -- 2.0f" here saturation will change
public void setSaturation(float sat)
{
System.out.println("qqqqqqqqqq "+sat);
bitmap3=updateSat(bitmap2, sat);
invalidate();
}
}
--------> Seekbar to change radius
radius_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
text_radius.setText(""+progress);
circularImageView.setCornerRadius(progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
// Seekbar to change shadow
shadow_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
float f= 4+progress/10.0f;
text_shadow.setText(""+progress);
circularImageView.setShadow(f);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
// Seekbar to change saturation
saturation_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
int progressSat = saturation_seekbar.getProgress();
float sat = (float) ((progressSat*4 / 100.0f)-1.0f);
circularImageView.setSaturation(sat);
text_saturation.setText(""+progressSat);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
// Seekbar to change stroke
stroke_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
if (progress==0)
{
float f=(progress*10.0f/100.0f);
circularImageView.setStroke(f);
}
else
{
float f=(progress*10.0f/100.0f);
circularImageView.setStroke(f);
}
text_stroke.setText(""+progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
//radius seekbar in xml file
<SeekBar
android:layout_width="match_parent"
android:layout_gravity="center"
android:progress="50"
android:max="250"
android:id="@+id/radius_seekbar"
android:layout_height="wrap_content" />
//saturation seekbar in xml file
<SeekBar
android:layout_width="match_parent"
android:layout_gravity="center"
android:progress="50"
android:max="100"
android:id="@+id/saturation_seekbar"
android:layout_height="wrap_content" />
//shadow seekbar in xml file
<SeekBar
android:layout_width="match_parent"
android:layout_gravity="center"
android:progress="0"
android:max="100"
android:id="@+id/shadow_seekbar"
android:layout_height="wrap_content" />
//stroke seekbar in xml file
<SeekBar
android:layout_width="match_parent"
android:layout_gravity="center"
android:progress="0"
android:max="100"
android:id="@+id/stroke _seekbar"
android:layout_height="wrap_content" />
<!-- Drop Shadow -->
<item>
<shape android:shape="oval">
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="#00CCCCCC" />
<corners android:radius="3dp" />
</shape>
</item>
<item>
<shape android:shape="oval">
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="#10CCCCCC" />
<corners android:radius="3dp" />
</shape>
</item>
<item>
<shape android:shape="oval">
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="#20CCCCCC" />
<corners android:radius="3dp" />
</shape>
</item>
<item>
<shape android:shape="oval">
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="#30CCCCCC" />
<corners android:radius="3dp" />
</shape>
</item>
<item>
<shape android:shape="oval">
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="#50CCCCCC" />
<corners android:radius="3dp" />
</shape>
</item>
<!-- Background Color (white) -->
<item>
<shape android:shape="oval">
<solid android:color="@android:color/white" />
<corners android:radius="3dp" />
</shape>
</item>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<layer-list>
<item>
<shape android:shape="oval">
<gradient
android:startColor="#FF000000"
android:endColor="#00000000"
android:gradientRadius="31dp"
android:type="radial"
/>
</shape>
</item>
<item android:top="4dp" android:left="4dp" android:right="4dp" android:bottom="4dp">
<shape android:shape="oval">
<size android:width="55dp"
android:height="55dp"/>
<solid android:color="@android:color/white" />
</shape>
</item>
</layer-list>
</item>
</selector>
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="@android:color/white"/>
</shape>
</item>
</layer-list>
<ImageView
android:id="@+id/alert_icon"
android:layout_width="@dimen/alert_icon"
android:layout_height="@dimen/alert_icon"
android:contentDescription="@string/your_shadow_rulez"
android:background="@drawable/white_oval"
android:elevation="@dimen/elevation_fab" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/margin_14dp"> // Point no. 3
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/img"
android:layout_width="@dimen/margin_56dp"
android:layout_height="@dimen/margin_56dp"
android:layout_margin="@dimen/margin_14dp" // Point no. 2
android:elevation="@dimen/margin_8dp" // Point no. 1
android:src="@drawable/ic_bell" />
</FrameLayout>
import android.graphics.Outline;
import android.view.View;
import android.view.ViewOutlineProvider;
public class CircularOutlineProvider extends ViewOutlineProvider {
@Override
public void getOutline(View view, Outline outline) {
outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), (view.getWidth() / 2F));
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
findViewById(R.id.img).setOutlineProvider(new CircularOutlineProvider());