文档章节

Android绘制圆形图片(五)

危险游戏
 危险游戏
发布于 2016/01/22 16:57
字数 368
阅读 202
收藏 6

效果图: 

第一步:新建RoundView自定义控件继承View

package com.rong.activity;

import com.rong.test.R;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.widget.ImageView;

/**
 * 利用Xfermode制作一个圆形图片
 * 
 * @author 徐荣
 *
 */
public class RoundView extends ImageView {
	/**
	 * 画笔
	 */
	private Paint mPaint;
	/**
	 * 原型图
	 */
	private Bitmap src;
	/**
	 * 遮罩层
	 */
	private Bitmap mask;

	public RoundView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// 初始化画笔
		mPaint = new Paint();
		mPaint.setAntiAlias(true);
		// 拿到原型图
		src = BitmapFactory.decodeResource(getResources(), R.drawable.ml);
	}

	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		super.onSizeChanged(w, h, oldw, oldh);
		// 图片的遮罩,为什么要在这里面初始化遮罩层呢?因为在这个方法里Width()和Height()才被初始化了
		mask = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), Config.ARGB_4444);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		// 设置画布的颜色为透明
		canvas.drawColor(Color.TRANSPARENT);
		// 划出你要显示的圆
		Canvas cc = new Canvas(mask);
		cc.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, getMeasuredHeight() / 2, mPaint);
		// 这个方法相当于PS新建图层,下面你要做的事就在这个图层上操作
		canvas.saveLayer(0, 0, getMeasuredWidth(), getMeasuredHeight(), null, Canvas.ALL_SAVE_FLAG);
		// 先绘制遮罩层
		canvas.drawBitmap(mask, 0, 0, mPaint);
		// 设置混合模式
		mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
		// 再绘制src源图
		canvas.drawBitmap(src, 0, 0, mPaint);
		// 还原混合模式
		mPaint.setXfermode(null);
		// 还原画布,相当于Ps的合并图层
		canvas.restore();
	}
}

第二步 新建布局文件Activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:orientation="vertical" >

    <com.rong.activity.RoundView
        android:layout_width="160dp"
        android:layout_height="160dp"
        android:layout_centerInParent="true" />

</RelativeLayout>


Run

© 著作权归作者所有

危险游戏
粉丝 15
博文 93
码字总数 19385
作品 0
杨浦
Android工程师
私信 提问
Android 圆角、圆形 ImageView 实现

一、 特点 基于AppCompatImageView扩展 支持圆角、圆形显示 可绘制边框,圆形时可绘制内外两层边框 支持边框不覆盖图片 可绘制遮罩 ...... 二、基本原理 我们要实现的图片控件继承自,它是的...

Othershe
2018/06/25
0
0
Android开发:用Drawable XML绘制带阴影效果的圆形按钮

众所周知,在Android开发里,为了优化在各种分辨率设备上的显示效果,同一份图片素材往往要提供mdpi、hdpi、xhdpi三种(以前还有ldpi),尤其是按钮类的素材,考虑到normal、pressed、focus...

新年
2015/05/08
0
0
Android 一个另类的显示圆形图片方式

刚在看自定义的知识点时,突然想起来,如果宽高相等,设置圆角的半径为宽高的一半时,不就是一个圆形嘛?! Cardview配合ImageView显示圆形图 1.布局文件 继承的。宽和高都为,设置圆角半径为...

北辰丨丶
01/30
0
0
android 通过修改图片像素实现CircleImageView

CircleImageView实现方法有很多种,各有优缺点,因此需要按照不同的场景使用。我们今天使用修改图片像素的方法实现CircleImageView,主要知识点无非是勾股定理和点到圆形的距离。 素材图片:...

IamOkay
04/13
0
0
在android中画圆形图片的几种办法

在开发中经常会有一些需求,比如显示头像,显示一些特殊的需求,将图片显示成圆角或者圆形或者其他的一些形状。但是往往我们手上的图片或者从服务器获取到的图片都是方形的。这时候就需要我们自...

码农明明
2014/09/19
0
5

没有更多内容

加载失败,请刷新页面

加载更多

新手转行学java难吗?新手学java需要注意的6个方面!

新手转行在成都学java到底难不难,对于这个问题,我们专门做过一个调查,超过1000名已经在职的java从业者,其中有80%的程序员觉得学java不难,20%的程序员觉得前期有点难,其中对于50%自学的...

Java领航员
57分钟前
3
0
动态规划-硬币问题分析

什么是动态规划 上次对动态规划已经有了个大概的分析。引用维基百科的话就是: dynamic programming is a method for solving a complex problem by breaking it down into a collection of...

AI考拉
今天
2
0
谈谈lucene的DocValues特性之SortedSetDocValuesField

SortedSetDocValuesField与SortedDocValuesField类似但它是一键多值的(注意:lucene的数据模型是支持一键多值的即key-values模型),lucene在实现时会判断是一键一值还是多值,如果单值就调...

FAT_mt
今天
1
0
生产者消费者模式

//尚学堂视频里,不是完整的 public class Movie { /** * 共同的资源 */ private String pic; //flay为true生产,false消费 private boolean flag=true; public synchronized void play(Str......

南桥北木
今天
1
0
使用阿里云镜像安装kubernetes

参考阿里云镜像 https://opsx.alibaba.com/mirror?lang=zh-CN 系统: CentOS / RHEL / Fedora cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https......

北漂的我
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部