BitmapShader繪製圓形圖片
今天我們使用BitmapShader
自定義View,繼承ImageView
/**
* Created by softpo on 2016/10/29.
*/
public class CircleImageView extends ImageView {
private Bitmap mBitmap;
private int mWidth,mHeight;
private BitmapShader mBitmapShader;
private ShapeDrawable mShapeDrawable;
public CircleImageView(Context context) {
this(context,null);
}
public CircleImageView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//得到影像
mBitmap = ((BitmapDrawable) getDrawable()).getBitmap();
mWidth = mBitmap.getWidth();
mHeight = mBitmap.getHeight();
//構造渲染器BitmapShader
/*
CLAMP :如果渲染器超出原始邊界範圍,會複製範圍內邊緣染色。
REPEAT :橫向和縱向的重複渲染器圖片,平鋪。
MIRROR :橫向和縱向的重複渲染器圖片,這個和REPEAT 重複方式不一樣,它是以映象方式平鋪。
*/
mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.MIRROR,Shader.TileMode.REPEAT);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
int modeHeight = MeasureSpec.getMode(heightMeasureSpec);
//精確賦值
/**
* EXACTLY:當我們設定width或height為match_parent或者固定值時,容器在佈局時呼叫子 view的measure方法傳入的模式是EXACTLY,
* 因為子view會佔據剩餘容器的空間,所以它大小是確定的;
*
* AT_MOST:而當設定為 wrap_content時,容器傳進去的是AT_MOST,
* 表示子view的大小最多是多少,這樣子view會根據這個上限來設定自己的尺寸;
*
* UNSPECIFIED:是未指定尺寸,這種情況不多,一般都是父控制元件是AdapterView,通過measure方法傳入的模式
*/
if(modeWidth==MeasureSpec.EXACTLY&&modeHeight==MeasureSpec.EXACTLY){
mWidth = MeasureSpec.getSize(widthMeasureSpec);
mHeight = MeasureSpec.getSize(heightMeasureSpec);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
// super.onDraw(canvas);
//將圖片裁剪為橢圓形
//構建ShapeDrawable物件並定義形狀為橢圓
mShapeDrawable = new ShapeDrawable(new OvalShape());
//得到畫筆並設定渲染器
mShapeDrawable.getPaint().setShader(mBitmapShader);
//設定顯示區域
mShapeDrawable.setBounds(20, 20,mWidth,mHeight);
//繪製shapeDrawable
mShapeDrawable.draw(canvas);
}
}
佈局中使用:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.softpo.customviewdemo.MainActivity">
<com.softpo.customviewdemo.widget.CircleImageView
android:src="@mipmap/p7"
android:layout_width="300dp"
android:layout_height="300dp"/>
</RelativeLayout>
效果圖:
一:MIRROR :橫向和縱向的重複渲染器圖片,這個和REPEAT 重複方式不一樣,它是以映象方式平鋪
二:REPEAT :橫向和縱向的重複渲染器圖片,平鋪
三:CLAMP :如果渲染器超出原始邊界範圍,會複製範圍內邊緣染色。
相關文章
- BitmapShader 實現圓型圖片
- canvas 繪製圓形Canvas
- bitmapshader的clamp模式(繪製Bitmap渲染的橢圓)LAMP模式
- SVG <circle> 繪製圓形SVG
- 標準圓形餅圖Python繪製方法Python
- CSS魔法系列:純CSS繪製基本圖形(圓、橢圓等)CSS
- CSS圓形圖片效果CSS
- Glide實現圓角圖片,以及圓形圖片IDE
- java:繪製圖形Java
- 使用canvas繪製圓形進度條Canvas
- css繪製圓形程式碼例項CSS
- html5中canvas繪製圓形HTMLCanvas
- canvas繪製圓形圖案程式碼示例簡單介紹Canvas
- border-radius繪製圓形圖案程式碼例項
- 使用css繪製圖形CSS
- css繪製特殊圖形CSS
- Android 繪圖和shape圓形Android繪圖
- 使用java繪圖類Graphics繪製圓圈Java繪圖
- CGContextRef處理圓形圖片GCContext
- canvas繪製圓形框效果不填充內部Canvas
- canvas繪製圓形鐘錶程式碼例項Canvas
- canvas繪製實心圓形程式碼例項Canvas
- HTML5 Canvas使用路徑——繪製圓形HTMLCanvas
- 使用CreateJS繪製圖形JS
- 分段函式圖形繪製函式
- PS製作圓角圖片
- Python中OpenCV劃線、畫圓、橢圓、新增文字等幾何圖形繪製操作PythonOpenCV
- android圖片處理,讓圖片變成圓形Android
- 微信小程式裁剪圖片成圓形微信小程式
- 使用clay.js繪製一棵圓形樹JS
- Vue canvas繪製圓形進度條動畫載入VueCanvas動畫
- Shader 繪製基礎圖形
- Android Xfermode 實戰 實現圓形、圓角圖片Android
- CSS3繪製圖形圖案效果CSSS3
- AlamofireImage 使用 – swift載入網路圖片,縮放圖片,生成圓形圖片Swift
- 微信小程式之裁剪圖片成圓形微信小程式
- CircleImageView 圓形圖片頭像實現View
- 【Web前端基礎知識】如何使用Canvas繪製圓形Web前端Canvas