电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android自定義View圓形圖片控件代碼詳解

瀏覽:6日期:2022-09-21 14:29:48

前言

在日常開(kāi)發(fā)中,圓形的圖片效果還是很常見(jiàn)的??梢酝ㄟ^(guò)給Paint設(shè)置Xfermode來(lái)實(shí)現(xiàn),這里簡(jiǎn)單記錄如下。

實(shí)現(xiàn)

實(shí)現(xiàn)圓形效果的核心是PorterDuffXfermode,對(duì)于PorterDuffXfermode,這里不展開(kāi),可以查詢相關(guān)資料。

核心代碼

//繪制背景canvas.drawCircle(mSize / 2, mSize / 2, mSize / 2, mPaint);//設(shè)置模式為:顯示背景層和上層的交集,且顯示上層圖像mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//繪制要顯示的圖像canvas.drawBitmap(mSrcBitmap, 0, 0, mPaint);//重置XfermodemPaint.setXfermode(null);

自定義屬性

<?xml version='1.0' encoding='utf-8'?><resources> <declare-styleable name='CircleView'> <!--定義資源--> <attr name='src' format='reference' /> <!--定義類型--> <attr name='type' format='enum'> <!--圓形--> <enum name='round' value='1' /> <!--矩形--> <enum name='rect' value='2' /> </attr> </declare-styleable></resources>

自定義控件

public class CircleView extends View { private static final int DEFAULT_SIZE = 200; private static final int DEFAULT_RADIUS = 20; private static final int TYPE_ROUND = 1; private static final int TYPE_RECT = 2; private int mSize; private int mResourceId; private int mType; private Paint mPaint; private Bitmap mSrcBitmap; public CircleView(Context context) { this(context, null); } public CircleView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CircleView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CircleView); mResourceId = ta.getResourceId(R.styleable.CircleView_src, R.mipmap.ic_launcher); mType = ta.getInt(R.styleable.CircleView_type, TYPE_ROUND); ta.recycle(); init(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = getMeasureSize(widthMeasureSpec); int height = getMeasureSize(heightMeasureSpec); mSize = Math.min(width, height); setMeasuredDimension(mSize, mSize); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //繪制背景 if (mSrcBitmap == null) { mSrcBitmap = getScaleBitmap(); } if (mType == TYPE_ROUND) { canvas.drawCircle(mSize / 2, mSize / 2, mSize / 2, mPaint); } else if (mType == TYPE_RECT) { canvas.drawRoundRect(0, 0, mSize, mSize, DEFAULT_RADIUS, DEFAULT_RADIUS, mPaint); } //設(shè)置模式為:顯示背景層和上層的交集,且顯示上層圖像 mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); //繪制要顯示的圖像 canvas.drawBitmap(mSrcBitmap, 0, 0, mPaint); //重置Xfermode mPaint.setXfermode(null); } private void init() { //禁用硬件加速,否則可能無(wú)法繪制圓形 setLayerType(LAYER_TYPE_HARDWARE, null); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.FILL); } private int getMeasureSize(int measureSpec) { int mode = MeasureSpec.getMode(measureSpec); int size = MeasureSpec.getSize(measureSpec); return mode == MeasureSpec.EXACTLY ? size : DEFAULT_SIZE; } /** * 獲取縮放后的Bitmap * * @return */ private Bitmap getScaleBitmap() { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), mResourceId, options); options.inSampleSize = calcSampleSize(options, mSize, mSize); options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(getResources(), mResourceId, options); } /** * 計(jì)算縮放比例 * * @param option * @param width * @param height * @return */ private int calcSampleSize(BitmapFactory.Options option, int width, int height) { int originWidth = option.outWidth; int originHeight = option.outHeight; int sampleSize = 1; while ((originWidth = originWidth >> 1) > width && (originHeight = originHeight >> 1) > height) { sampleSize = sampleSize << 1; } return sampleSize; }}

注意:如果沒(méi)有圓形的效果,那么可能需要禁用硬件加速:setLayerType(LAYER_TYPE_HARDWARE, null)

布局

<?xml version='1.0' encoding='utf-8'?><LinearLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:app='http://schemas.android.com/apk/res-auto' xmlns:tools='http://schemas.android.com/tools' android:layout_width='match_parent' android:layout_height='match_parent' android:gravity='center_horizontal' android:orientation='vertical' tools:context='.MainActivity'> <com.wangyz.custom.CircleView android:layout_width='wrap_content' android:layout_height='wrap_content' android:layout_margin='10dp' app:src='http://www.hdgsjgj.cn/bcjs/@drawable/image' /> <com.wangyz.custom.CircleView android:layout_width='100dp' android:layout_height='100dp' android:layout_margin='10dp' app:src='http://www.hdgsjgj.cn/bcjs/@drawable/image' /> <com.wangyz.custom.CircleView android:layout_width='100dp' android:layout_height='100dp' android:layout_margin='10dp' app:src='http://www.hdgsjgj.cn/bcjs/@drawable/image' app:type='rect' /></LinearLayout>

效果

Android自定義View圓形圖片控件代碼詳解

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 大型工业风扇_工业大风扇_大吊扇_厂房车间降温-合昌大风扇 | 广州番禺搬家公司_天河黄埔搬家公司_企业工厂搬迁_日式搬家_广州搬家公司_厚道搬迁搬家公司 | 低合金板|安阳低合金板|河南低合金板|高强度板|桥梁板_安阳润兴 北京租车牌|京牌指标租赁|小客车指标出租 | 儿童乐园|游乐场|淘气堡招商加盟|室内儿童游乐园配套设备|生产厂家|开心哈乐儿童乐园 | 商秀—企业短视频代运营_抖音企业号托管 | 北京包装设计_标志设计公司_包装设计公司-北京思逸品牌设计 | 无锡门窗-系统门窗-阳光房-封阳台-断桥铝门窗厂[窗致美] | 塑胶跑道_学校塑胶跑道_塑胶球场_运动场材料厂家_中国塑胶跑道十大生产厂家_混合型塑胶跑道_透气型塑胶跑道-广东绿晨体育设施有限公司 | 艺术涂料_进口艺术涂料_艺术涂料加盟_艺术涂料十大品牌 -英国蒙太奇艺术涂料 | 欧洲MV日韩MV国产_人妻无码一区二区三区免费_少妇被 到高潮喷出白浆av_精品少妇自慰到喷水AV网站 | 生物制药洁净车间-GMP车间净化工程-食品净化厂房-杭州波涛净化设备工程有限公司 | 防水套管|柔性防水套管|伸缩器|伸缩接头|传力接头-河南伟创管道 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 免费分销系统 — 分销商城系统_分销小程序开发 -【微商来】 | 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | LHH药品稳定性试验箱-BPS系列恒温恒湿箱-意大利超低温冰箱-上海一恒科学仪器有限公司 | 升降机-高空作业车租赁-蜘蛛车-曲臂式伸缩臂剪叉式液压升降平台-脚手架-【普雷斯特公司厂家】 | 全自动面膜机_面膜折叠机价格_面膜灌装机定制_高速折棉机厂家-深圳市益豪科技有限公司 | 专业音响设备_舞台音响设备_会议音响工程-首选深圳一禾科技 | 分轨 | 上传文件,即刻分离人声和伴奏 | 冷油器,取样冷却器,热力除氧器-连云港振辉机械设备有限公司 | 尊享蟹太太美味,大闸蟹礼卡|礼券|礼盒在线预订-蟹太太官网 | 博客-悦享汽车品质生活| WTB5光栅尺-JIE WILL磁栅尺-B60数显表-常州中崴机电科技有限公司 | 五轴加工中心_数控加工中心_铝型材加工中心-罗威斯 | 合肥钣金加工-安徽激光切割加工-机箱机柜加工厂家-合肥通快 | 温州在线网| 溶氧传感器-pH传感器|哈美顿(hamilton) | 广州二手电缆线回收,旧电缆回收,广州铜线回收-广东益福电缆线回收公司 | 矿用履带式平板车|探水钻机|气动架柱式钻机|架柱式液压回转钻机|履带式钻机-启睿探水钻机厂家 | 【365公司转让网】公司求购|转让|资质买卖_股权转让交易平台 | b2b网站大全,b2b网站排名,找b2b网站就上地球网 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 细沙回收机-尾矿干排脱水筛设备-泥石分离机-建筑垃圾分拣机厂家-青州冠诚重工机械有限公司 | 电动液压篮球架_圆管地埋式篮球架_移动平箱篮球架-强森体育 | 顺景erp系统_erp软件_erp软件系统_企业erp管理系统-广东顺景软件科技有限公司 | 密集架-手摇-智能-移动-价格_内蒙古档案密集架生产厂家 | 膜结构车棚|上海膜结构车棚|上海车棚厂家|上海膜结构公司 | 高温链条油|高温润滑脂|轴承润滑脂|机器人保养用油|干膜润滑剂-东莞卓越化学 | 离子色谱自动进样器-青岛艾力析实验科技有限公司 | 欧盟ce检测认证_reach检测报告_第三方检测中心-深圳市威腾检验技术有限公司 | 天津试验仪器-电液伺服万能材料试验机,恒温恒湿标准养护箱,水泥恒应力压力试验机-天津鑫高伟业科技有限公司 |