android圓角陰影
⑴ Android 5.0 elevation 設置陰影無效
elevation 設置陰影需要注意兩點:
1、view需要設置背景
2、陰影是繪制在父控制項上的,子控制項和父控制項之間要留空隙,用padding也不行
在開發過程中有過這樣的布局:
我子Linearlayout是設置的圓角背景,結果這樣的效果是:只有圓角的便便才有一丁點的陰影,原因是父布局設置的是padding,子控制項是match_parent,空隙不足導致,將子布局改為margin,去掉父控制項的padding就行了
⑵ android 安卓 類似ONE卡片頁(包含圖片文字等)怎麼實現
Android5.0中向我們介紹了一個全新的控制項–CardView,從本質上看,可以將CardView看做是FrameLayout在自身之上添加了圓角和陰影效果。請注意:CardView被包裝為一種布局,並且經常在ListView和RecyclerView的Item布局中,作為一種容器使用。
下面例子來源於android學習手冊, android學習手冊包含9個章節,108個例子,源碼文檔隨便看,例子都是可交互,可運行,源碼採用android studio目錄結構,高亮顯示代碼,文檔都採用文檔結構圖顯示,可以快速定位。360手機助手中下載,排在第四個。
CardView應該被使用在顯示層次性的內容時;在顯示列表或網格時更應該被選擇,因為這些邊緣可以使得用戶更容易去區分這些內容。
使用CardView
首先,假設你的布局如同下面的形式:
<FrameLayout xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <!-- Main Content View --> <RelativeLayout> ... </RelativeLayout> </FrameLayout>
為了使用上面的布局方式來創建一個卡片,首先你需要導入支持的依賴庫(android-support-v7-cardview的jar包)在你的build.gradle文件中。
dependencies { ... compile 'com.android.support:cardview-v7:21.0.2' }
現在將FrameLayout替換為CardView,
<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <!-- Main Content View --> <RelativeLayout> ... </RelativeLayout> </android.support.v7.widget.CardView>
就是這樣!使用依賴庫能夠保證你的程序穩定的兼容之前的版本;盡管在AndroidL和之前的Android版本中對其處理方式有所不同。
⑶ 如何在圓形 imageView android 上添加一個陰影和邊界
我創建了 CircularImageView 這一問題:創建在 android 中的圓形圖像視圖
下載GitHub的項目
1) 這是 CircularImageView 類:
public class CircularImageView extends ImageView {
public CircularImageView(Context context) {
super(context);
}
public CircularImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CircularImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if (drawable == null) {
return;
}
if (getWidth() == 0 || getHeight() == 0) {
return;
}
Bitmap b = ((BitmapDrawable)drawable).getBitmap() ;
Bitmap bitmap = b.(Bitmap.Config.ARGB_8888, true);
Bitmap roundBitmap = getCroppedBitmap(bitmap, getWidth());
canvas.drawBitmap(roundBitmap, 0, 0, null);
}
public static Bitmap getCroppedBitmap(Bitmap bmp, int radius) {
Bitmap sbmp;
if(bmp.getWidth() != radius || bmp.getHeight() != radius)
sbmp = Bitmap.createScaledBitmap(bmp, radius, radius, false);
else
sbmp = bmp;
Bitmap output = Bitmap.createBitmap(sbmp.getWidth(), sbmp.getHeight(), Bitmap.Config.ARGB_8888);
final Rect rect = new Rect(0, 0, sbmp.getWidth(), sbmp.getHeight());
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
paint.setColor(Color.parseColor("#BAB399"));
Canvas c = new Canvas(output);
c.drawARGB(0, 0, 0, 0);
c.drawCircle(sbmp.getWidth() / 2+0.7f, sbmp.getHeight() / 2+0.7f, sbmp.getWidth() / 2+0.1f, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
c.drawBitmap(sbmp, rect, rect, paint);
return output;
}
}
2) 我在我像這樣的布局中使用:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#cccccc"
android:gravity="center"
android:orientation="vertical"
android:padding="10dp" >
<com.mikhaellopez.circularimageview.CircularImageView
android:id="@+id/imageViewCircular"
android:layout_width="@dimen/image_view_size"
android:layout_height="@dimen/image_view_size"
android:layout_gravity="center"
android:background="@drawable/border"
android:src="@drawable/image" />
</LinearLayout>
⑷ Android設置圖片圓角的方法
Android中經常會遇到對圖片進行二次處理,例如加圓角,或者顯示圓形圖片
通過第三方框架Glide實現圖片顯示有圓角,有三種寫法如下:
1.1、第一種實現:
1.2、第二種實現:
1.3、第三種實現:
自定義ImageView:
對圖片進行處理,此方法還可以加邊框
實現圓形和邊框:
以上就是本文的全部內容,希望對大家的學習有所幫助!
⑸ 同時設置圓角和陰影
先說一下ImageView吧,開始的時候因為我沒有拿到UI切圖,所以先給它設置了一個背景顏色,然後設置了圓角和陰影。
結果發現圓角有了,陰影卻並沒有出來。。。
於是發現,是因為layer的masksToBounds設置成true導致把它范圍之外的部分給裁剪掉了,所以陰影也被幹掉了,於是我把masksToBounds的設置去掉了(默認為false)
結果發現圓角和陰影就都有了
然而事情並沒有結束,因為當UI切圖出來之後,我設置了一張圖片,結果發現圓角又沒有了。。。
在這個imageView的下邊添加一個底部視圖,位置約束跟imageView相同,用來專門設置陰影效果,然後把imageView添加到底部視圖上,最後給imageView設置圓角(這次要把masksToBounds設置成true)
圓角和陰影終於出來了:
同理,按鈕也是一樣的情況,如果只給按鈕設置了backgroundColor,並不會有按壓效果,如果要有按壓效果,就要給button設置BackgroundImage及相應的UIControlState
但是設置之後,效果就如同imageView上述情況一樣了,同樣解決方法也用以上方法就能搞定。
除了以上這個方法添加view之外,好像也可以添加layer來實現,但是因為layer無法設置約束,還要到viewDidLayoutSubviews方法中設置frame,所以就放棄了。
⑹ Android 實現圓角布局,變相實現圓角圖片效果(不同位置不同弧度)
小菜最近在處理圖片的圓角,不止是四個角全是圓角,還包括單左側/單右側/對角線方向的圓角。因為自己太菜只能尋求網上的大神,發現一個自定義圓角布局,這樣可以變相的解決我的需求,還可以實現更多的圓角效果,不僅是圖片,還包括其他布局。
小菜我作為伸手黨,非常感謝大神的分享,參考原文 RoundAngleFrameLayout 。
這個布局實現方式很簡單,大神只提供了默認的四個圓角,這里我添加了一些方法可以動態的設置圓角的位置與弧度,並說明一下小菜遇到的小問題。小菜根據大神的總結自定義了一個 MyRoundLayout GitHub 布局樣式。
Tips:
⑺ android 如何重寫imageview 讓圖片有圓角效果
android 自定義圓角ImageView以及鋸齒的處理
看到很多人開發過程中要使用圓角圖片時,解決方法有:
1.重新繪制一張圖片
2.通過布局來配置
3.通過重寫View來實現
其中1,2在這里就不講了,重點講講方法三的實現。
實現一:通過截取畫布一個圓形區域與圖片的相交部分進行繪制,缺點:鋸齒明顯,設置Paint,Canvas抗鋸齒無效。
package com.open.circleimageview.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.Region;
import android.util.AttributeSet;
import android.view.View;
public class CircleImageViewA extends View {
public CircleImageViewA(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CircleImageViewA(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CircleImageViewA(Context context) {
super(context);
}
private Bitmap bitmap;
private Rect bitmapRect=new Rect();
private PaintFlagsDrawFilter pdf=new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
private Paint paint = new Paint();
{
paint.setStyle(Paint.Style.STROKE);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
paint.setAntiAlias(true);// 設置畫筆的鋸齒效果。 true是去除,大家一看效果就明白了
}
private Path mPath=new Path();
public void setImageBitmap(Bitmap bitmap)
{
this.bitmap=bitmap;
}
@Override
protected void onDraw(Canvas canvas) {
if(null==bitmap)
{
return;
}
bitmapRect.set(0, 0, getWidth(), getHeight());
canvas.save();
canvas.setDrawFilter(pdf);
mPath.reset();
canvas.clipPath(mPath); // makes the clip empty
mPath.addCircle(getWidth()/2, getWidth()/2, getHeight()/2, Path.Direction.CCW);
canvas.clipPath(mPath, Region.Op.REPLACE);
canvas.drawBitmap(bitmap, null, bitmapRect, paint);
canvas.restore();
}
}
實現二:通過PorterDuffXfermode 方式(注意要設置硬體加速,否則部分機子無效),優點:鋸齒基本沒有
package com.open.circleimageview.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
public class CircleImageViewB extends View {
public CircleImageViewB(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public CircleImageViewB(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CircleImageViewB(Context context) {
super(context);
init();
}
private Bitmap bitmap;
private Rect bitmapRect=new Rect();
private PaintFlagsDrawFilter pdf=new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
private Paint paint = new Paint();
{
paint.setStyle(Paint.Style.STROKE);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
paint.setAntiAlias(true);// 設置畫筆的鋸齒效果。 true是去除,大家一看效果就明白了
}
private Bitmap mDstB=null;
private PorterDuffXfermode xfermode=new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY);
private void init()
{
try {
if(android.os.Build.VERSION.SDK_INT>=11)
{
setLayerType(LAYER_TYPE_SOFTWARE, null);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void setImageBitmap(Bitmap bitmap)
{
this.bitmap=bitmap;
}
private Bitmap makeDst(int w, int h)
{
Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bm);
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setColor(Color.parseColor("#ffffffff"));
c.drawOval(new RectF(0, 0, w, h), p);
return bm;
}
@Override
protected void onDraw(Canvas canvas) {
if(null==bitmap)
{
return;
}
if(null==mDstB)
{
mDstB=makeDst(getWidth(), getHeight());
}
bitmapRect.set(0, 0, getWidth(), getHeight());
canvas.save();
canvas.setDrawFilter(pdf);
canvas.drawBitmap(mDstB, 0, 0, paint);
paint.setXfermode(xfermode);
canvas.drawBitmap(bitmap, null, bitmapRect, paint);
paint.setXfermode(null);
canvas.restore();
}
}
⑻ Android圓角背景設置
使用databinding設置圓角背景,代替drawable方式
注意:這個只是設置一個背景,所有圖片的圓角不能使用它,只能是viewGroup或者TextView。
提示:圖片可以使用QMUIRadiusImageView
1、支持view和viewGroup的圓角,邊框、和單個圓角等;
2、app:bgRadius:圓角大小,必須用"@{R.dimen.ui_dp8}"賦值;
3、app:bgSolidColor:設置背景色;
4、app:bgStrokeColor:設置邊框顏色;
5、bgTopLeftRadius:設置左上的圓角;
⑼ Android如何純java代碼實現字體陰影效果
Android實現純java代碼字體陰影效果,主要是通過activity的draw方法,進行重新繪制,如下代碼:
packagecanvas.test;
importandroid.app.Activity;
importandroid.os.Bundle;
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.view.View;
{
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(newImageEffect(this));
}
classImageEffectextendsView{
Paintpaint;
publicImageEffect(Contextcontext){
super(context);
paint=newPaint();//初始化畫筆,為後面陰影效果使用。
paint.setAntiAlias(true);//去除鋸齒。
paint.setShadowLayer(5f,5.0f,5.0f,Color.BLACK);//設置陰影層,這是關鍵。
paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));
}
@Override
publicvoidonDraw(Canvascanvas){
super.onDraw(canvas);
intposX=20;
intposY=50;
intPicWidth,PicHegiht;
Drawabledrawable=getResources().getDrawable(R.drawable.button);
Drawabledbe=getResources().getDrawable(R.drawable.button).mutate();//如果不調用mutate方法,則原圖也會被改變,因為調用的資源是同一個,所有對象是共享狀態的。
DrawabledrawTest=getResources().getDrawable(R.drawable.button);
Bitmapbmp=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);
//Rectrect=newRect(2*posX+PicWidth,2*posY+PicHegiht,2*posX+2*PicWidth,2*posY+2*PicHegiht);//此為理論上的陰影圖坐標
Rectrect=newRect(2*posX+PicWidth+3,2*posY+PicHegiht+3,2*posX+2*PicWidth-2,2*posY+2*PicHegiht-2);
//由於圖片的實際尺寸比顯示出來的圖像要大一些,因此需要適當更改下大小,以達到較好的效果
RectFrectF=newRectF(rect);
canvas.drawRoundRect(rectF,10f,10f,paint);//在原有矩形基礎上,畫成圓角矩形,同時帶有陰影層。
canvas.drawBitmap(bmp,2*posX+PicWidth,2*posY+PicHegiht,null);//畫上原圖。
canvas.restore();
}
}
}
⑽ Android中CardView的使用
一、簡介
Material design 中有一種很個性的設計概念:卡片式設計(Cards),這種設計與傳統的List Item 有所區別,Cards 包含更多的內容元素和擁有自己的 UI 特徵,關於 Cards 的設計規范可以參考官網介紹:
https://material.google.com/components/cards.html#
為了更好地實現這種 Cards UI 的設計,Google在v7 包中引進了一種全新的控制項:CardVew。用一句話介紹了 CardView:一個帶圓角和陰影背景的 FrameLayout。CardView在Android Lollipop(API 21)及以上版本的系統中適配較好。
二、導入依賴
compile 'com.android.support:cardview-v7:版本'
三、常用屬性
1. API 5 以上(Android 2.0)
1.1 app:cardConerRadius: 圓角的半徑
1.2 app:cardBackgroundColor:CardView 的卡片顏色
2. API 21 以上(Android 5.0)
2.1 app:cardElevation:CardView 的 Z 軸陰影
2.2 app:cardMaxElevation:陰影的最大高度
2.3 android:foreground="?android:attr/selectableItemBackground":點擊時有波紋發散效果
四、排版技巧
CardView 從本質上屬於 FrameLayout,而 CardView 通常包含了較多的內容元素,為了方 便 地 排 版 布 局 中 的 各 個 元 素 , 一 般 借 助 於 其 他 基 本 布 局 容 器 , 比 如 使 用 了 一個RelativeLayout 作為 CardView 的唯一子布局。