Android 원 각 테두리 구현 방식 집합

우선 나 는 원 각 테 두 리 를 실현 하 는 dmeo 프로그램 효과 도 를 몇 가지 붙 일 것 이다.

방식 1:shape 요 소 를 사용 하여 배경 을 채 우 고 원 각/라디안 각 을 설정 합 니 다.
1.먼저\res\drawable 에서 Shape 를 루트 요소 로 하 는 자원 파일 을 새로 만 듭 니 다:cornersbg.xml,코드 는 다음 과 같 습 니 다.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!--            -->
<solid android:color="#FFFFFF" />
<!--              -->
<corners android:radius="10dp"/>
<!--                 -->
<stroke android:color="#CD2626"
android:width="2dp"/>
</shape>
2.layot 레이아웃 파일 에서 원 각 이 필요 한 컨트롤 에 대해 첫 번 째 xml 파일 을 배경 으로 참조 하면 됩 니 다.그림 과 같다

3.효 과 는 demo 프로그램 효과 그림 의 그림 효과 로 나타 납 니 다.
방식 2:사용.9<9 매>원 각 그림 을 배경 으로 설정 합 니 다.

그림 mmtitle_act_btn_normal.9.png 는 원 각 이 있 는 그림 으로 컨트롤[여 기 는 Button]배경 자원 으로 참조 하면 됩 니 다.데모 프로그램 효과 그림 의 그림 2 효 과 를 표시 합 니 다.
방식 3:컨트롤 을 다시 쓰 는 draw 방법[여 기 는 ImageView 계승 을 예 로 들 겠 습 니 다]:다시 draw 방법 으로 컨트롤 의 원 각 효 과 를 그립 니 다.
1.CornersImageView.자바 사용자 정의 원 각 ImageView 코드 는 다음 과 같 습 니 다.

package com.ice.cornersdemo;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
/**
*        ImageView
* Created by ice on 14-8-6.
*/
public class CornersImageView extends ImageView{
private Bitmap mBitmap;
private BitmapShader mBitmapShader;
private final Matrix mShaderMatrix = new Matrix();
private final Paint mBitmapPaint = new Paint();
private final RectF mDrawableRect = new RectF();
private float mDrawableRadius;
private int mBitmapWidth;
private int mBitmapHeight;
private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
private static final int COLORDRAWABLE_DIMENSION = 1;
public CornersImageView(Context context)
{
super(context);
}
public CornersImageView(Context context, AttributeSet attrs)
{
this(context, attrs, 0);
}
public CornersImageView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
init();
}
private void init() {
if (mBitmap == null)
{
return;
}
mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
//      
mBitmapPaint.setAntiAlias(true);
//            
mBitmapPaint.setShader(mBitmapShader);
mBitmapWidth = mBitmap.getWidth();
mBitmapHeight = mBitmap.getHeight();
mDrawableRect.set(0, 0, mBitmapWidth, mBitmapHeight);
//            
mDrawableRadius = Math.min(mDrawableRect.width()/2, mDrawableRect.height()/2);
invalidate();
}
@Override
public void draw(Canvas canvas)
{
if (getDrawable() == null)
{
return;
}
canvas.drawCircle(getWidth()/2, getHeight()/2, mDrawableRadius, mBitmapPaint);
}
@Override
public void setImageBitmap(Bitmap bm) {
super.setImageBitmap(bm);
mBitmap = bm;
init();
}
@Override
public void setImageDrawable(Drawable drawable) {
super.setImageDrawable(drawable);
mBitmap = getBitmapFromDrawable(drawable);
init();
}
@Override
public void setImageResource(int resId) {
super.setImageResource(resId);
mBitmap = getBitmapFromDrawable(getDrawable());
init();
}
/**
*  Drawable   Bitmap  
* @param drawable
* @return
*/
private Bitmap getBitmapFromDrawable(Drawable drawable) {
if (drawable == null) {
return null;
}
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
try {
Bitmap bitmap;
if (drawable instanceof ColorDrawable) {
bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION,
BITMAP_CONFIG);
} else {
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),
BITMAP_CONFIG);
}
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
} catch (OutOfMemoryError e) {
return null;
}
}
}
2.레이아웃 파일 에서 사용자 정의 컨트롤 을 사용 합 니 다.CornersImageView 는 다음 과 같 습 니 다.

3.데모 프로그램 효과 그림 의 그림 3 효과 표시
기타:사실 그림 의 원형 디 스 플레이 를 실현 하기 전에 소개 한 이미지 뷰 를 다시 쓰 는 draw 방법 은 컨트롤 자체 에서 처리 하 는 것 이 고 더 간단 한 방법 은 표시 할 그림 에 대해 처리 하고 그림 자 체 를 원형 으로 잘라 서 컨트롤 이미지 뷰 에 표시 하 는 것 이다.
그림 의 원형 을 자 르 는 방법 은 다음 과 같다.

/**
*           
* @param bitmap
* @return
*/
public static Bitmap getCircleBitmap(Bitmap bitmap) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
RectF rectF = new RectF(rect);
Paint paint = new Paint();
paint.setAntiAlias(true); //        
paint.setFilterBitmap(true); //          
canvas.drawOval(rectF, paint); //   rectF       /  
//                 SRC_IN
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rectF, paint);
return output;
}
코드 에 있어 서 우 리 는 그림 을 표시 할 Bitmap 대상 을 얻 은 후에 위의 방법 을 호출 합 니 다.
getCircleBitmap(Bitmap bitmap)를 원형 으로 자 른 후 새로운 Bitmap 대상 을 얻 은 다음 ImageView 방법 을 사용 하여 setImageBitma(Bitmapbitmap)를 컨트롤 에 표시 합 니 다.데모 프로그램 효과 그림 의 그림 4 효 과 를 표시 합 니 다.
[그림 3 효과 와 같다]

좋은 웹페이지 즐겨찾기