Android-只有2个圆角的ImageView

本例子是针对将图片两个直角转换为圆角的例子:

1.自定义3个属性 宽高,圆角值:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyPhotoView">
        <attr name="width" format="dimension"></attr>
        <attr name="height" format="dimension"></attr>
        <attr name="radus" format="dimension"></attr>
    </declare-styleable>
</resources>

2.在引用的布局中使用

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bc="http://schemas.android.com/apk/res/org.lean"
    android:layout_width="match_parent"
    android:layout_height="match_parent"  >
	<org.lean.MyPhotoView
	    android:id="@+id/photo_iv"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:layout_marginTop="20dp"
	    android:layout_marginLeft="60dp"
	    bc:width="160dp"
	    bc:height="240dp"
	    bc:radus="10dp" />
</RelativeLayout>

3.在Java代码中设置两个图层。这里有2个图片 先绘制的叫目标图层,然后设置混合渲染绘制 ,后绘制的图层成为源图层。

SRC_IN 模式在两者相交的地方绘制源图层(同时隐藏目标图层),并且绘制的效果会受到目标图像对应地方透明度的影响;

package org.lean;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.widget.ImageView;

/**
 *	重绘的ImageView
 *
 * @author Lean
 */
public class MyPhotoView extends ImageView{

	private Bitmap mImageBtp;
	private Rect mImageSrcRect ,mImageDesRect;
	private Rect mBtmRect;
	private float mTotalWidth;
	private float mTotalHeight;
	private float mRadus;

	public MyPhotoView(Context context,int with,int height,float radus) {
		super(context);
		mTotalWidth=with;
		mTotalHeight=height;
		mRadus=radus;
	}

	public MyPhotoView(Context context, AttributeSet attrs) {
		super(context, attrs);

		TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MyPhotoView);
		mTotalWidth = array.getDimensionPixelSize(R.styleable.MyPhotoView_width, 0);
		mTotalHeight = array.getDimensionPixelSize(R.styleable.MyPhotoView_height, 0);
		mRadus = array.getDimensionPixelSize(R.styleable.MyPhotoView_radus, 0);
		array.recycle();
	}

	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		super.onSizeChanged(w, h, oldw, oldh);
		mImageDesRect=new Rect(0, 0,(int)mTotalWidth, (int)mTotalHeight);
		mBtmRect=new Rect(0, 0,(int)mTotalWidth,(int)(mTotalHeight+mRadus));
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG);
		PorterDuffXfermode xfermode=new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
		canvas.drawColor(Color.WHITE);
		int saveCount=canvas.saveLayer(0,0, mTotalWidth,mTotalHeight,paint,Canvas.ALL_SAVE_FLAG);
		if (mImageBtp!=null) {
			paint.setColor(Color.WHITE);
			canvas.drawRoundRect(new RectF(mBtmRect), mRadus, mRadus, paint);
			paint.setXfermode(xfermode);
			canvas.drawBitmap(mImageBtp,mImageSrcRect,mImageDesRect,paint);
			paint.setXfermode(null);
		}
		canvas.restoreToCount(saveCount);
	}

	@Override
	public void setImageBitmap(Bitmap bm) {
		super.setImageBitmap(bm);
		mImageBtp=bm;
		reCalculateRect();
	}

	private void reCalculateRect() {
		mImageSrcRect=new Rect(0, 0,mImageBtp.getWidth(),mImageBtp.getHeight());
		invalidate();
	}

	@Override
	public void setImageResource(int resId) {
		super.setImageResource(resId);
		mImageBtp=((BitmapDrawable)getResources().getDrawable(resId)).getBitmap();
		reCalculateRect();
	}

}
时间: 2024-10-10 16:40:14

Android-只有2个圆角的ImageView的相关文章

【Android学习笔记】圆角矩形ImageView自定义控件的实现与使用

在做安卓项目的过程中,我们总会遇到需要以圆角矩形控件来显示图标.图片或者按钮的需求,解决办法有两种,一种是在drawable下创建shape布局xml文件,另一种是自定义一个继承于ImageView的自定义控件类来实现,下面是具体的实现办法. 首先我们命名一个XCRoundRectImageView类,并继承于ImageView.代码如下: 1 import android.content.Context; 2 import android.graphics.Bitmap; 3 import a

Android开发之自定义圆角矩形图片ImageView的实现

android中的ImageView只能显示矩形的图片,这样一来不能满足我们其他的需求,比如要显示圆角矩形的图片,这个时候,我们就需要自定义ImageView了,其原理就是首先获取到图片的Bitmap,然后进行裁剪对应的圆角矩形的bitmap,然后在onDraw()进行绘制圆角矩形图片输出. 效果图如下: 自定义的圆形的ImageView类的实现代码如下: package com.xc.xcskin.view; import android.content.Context; import and

Android 圆形、圆角图片ImageView

圆形.圆角图片ImageView 当时做这个功能的时候也是从网上找的.比较好用的demo 作者以及详细解释请见:Android BitmapShader 实战 实现圆形.圆角图片 在这里主要讲一下如何使用 1.把RoundImageView导入包下 2.在xml中配置 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.a

Android Shape自定义纯色圆角按钮

版权声明:分享技术,传播快乐.如果本博客对你有帮助,请在我的博客首页为我打赏吧! 在Android开发中,为响应美化应用中控件的效果,使用Shape定义图形效果,可以解决图片过多的问题. 首先看一下效果图: 整个页面布局为: 1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res

android自定义listview实现圆角

在项目中我们会经常遇到这种圆角效果,因为直角的看起来确实不那么雅观,可能大家会想到用图片实现,试想上中下要分别做三张图片,这样既会是自己的项目增大也会增加内存使用量,所以使用shape来实现不失为一种更好的实现方式.在这里先看一下shape的使用: [html] view plaincopy <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schema

Android 设计一个菱形形状的Imageview组件.

网上没有资料,特来请教下大神 Android 设计一个菱形形状的Imageview组件. >> android 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/android/1010000007107851/Android设计一个菱形形状的Imageview组件.html

Android -- 图片编辑:创建圆角图片

创建圆角图片的方式大同小异,最简单的就是 9.png 美工做出来的就是,这样的最省事直接设置即可. 第二种就是通过裁剪 这里的剪裁指的是根据原图我们自己生成一张新的bitmap,这个时候指定图片的目标区域为一个圆角局域.这种做法有一点需要生成一个新的bitmap,所以会消耗至少2倍的图片内存, 下面分析一下代码的含义: a.首先创建一个指定高宽的bitmap,作为输出的内容, b.然后创建一个相同大小的矩形,利用画布绘制时指定圆角角度,这样画布上就有了一个圆角矩形. c.最后就是设置画笔的剪裁方

android 带边框的圆角按钮

新建buttonstyle.xml 代码如下 <?xml version="1.0" encoding="UTF-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 连框颜色值 --><item> <shape> <solid android:color="#1

Android开发之自定义圆形的ImageView的实现

android中的ImageView只能显示矩形的图片,这样一来不能满足我们其他的需求,比如要显示圆形的图片,这个时候,我们就需要自定义ImageView了,其原理就是首先获取到图片的Bitmap,然后进行裁剪圆形的bitmap,然后在onDraw()进行绘制圆形图片输出. 效果图如下: 自定义的圆形的ImageView类的实现代码如下: package com.xc.xcskin.view; import android.content.Context; import android.grap

Android中点击button,实现ImageView中图片的循环切换

今天有做到这个功能,上网找了资料,看到一个挺好的(http://blog.sina.com.cn/s/blog_60539d04010143ir.html),做了下小修改. activity代码: package ztestchangedpicture; import com.example.ztestchangedpicture.R; import android.app.Activity; import android.os.Bundle; import android.view.View;