Android中通过反射实现圆角ImageView代码实例_Android

private void init(){
    paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    roundRect = new RectF(0, 0, getWidth() , getHeight());
    radius = 40;
    mPorterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN) ;
  }

继承ImageView,在构造方法中调用,初始化Paint和Xfermode。

 protected void onDraw(Canvas canvas) {
    int sc = canvas.saveLayer(0, 0, getWidth() , getHeight(), null,
        Canvas.MATRIX_SAVE_FLAG |
        Canvas.CLIP_SAVE_FLAG |
        Canvas.HAS_ALPHA_LAYER_SAVE_FLAG |
        Canvas.FULL_COLOR_LAYER_SAVE_FLAG |
        Canvas.CLIP_TO_LAYER_SAVE_FLAG);
    roundRect.set(0, 0, getWidth(), getHeight());
    canvas.drawRoundRect(roundRect, radius, radius, paint);
    reflectSetXfermod();
    super.onDraw(canvas);
    canvas.restoreToCount(sc);
  }

重写ImageView的onDraw方法,通过xfermode实现圆角

private void reflectSetXfermod(){
    Drawable drawable = getDrawable();
    if(drawable == null){
      return;
    }    

    Class bsClass = null;
    Class[] innerClasses = BitmapDrawable.class.getDeclaredClasses();
    for(Class innerClass :innerClasses)
    {
      String name = innerClass.getName();
      System.out.println("-----innerClass---"+name);
      if(name.equals("android.graphics.drawable.BitmapDrawable$BitmapState"))
      {
        bsClass = innerClass;
      }
    }

    if(bsClass!= null){
      try {
        Field mPaintField = bsClass.getDeclaredField("mPaint");
        mPaintField.setAccessible(true);
        ConstantState constantState = ((BitmapDrawable)drawable).getConstantState();
        Paint paint = (Paint)mPaintField.get(constantState);
        paint.setXfermode(mPorterDuffXfermode);
      } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      } catch (NoSuchFieldException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }

通过反射的方法将xfermode设置到BitmapDrawable 里面的内部类BitmapState里的对象mPaint,用来绘制图片。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, imageview
, 圆角
反射
imageview 圆角、android圆角imageview、ios imageview 圆角、imageview设置圆角、imageview圆角边框,以便于您获取更多的相关知识。

时间: 2024-08-31 08:29:40

Android中通过反射实现圆角ImageView代码实例_Android的相关文章

Android中通过反射实现圆角ImageView代码实例

private void init(){ paint = new Paint(Paint.ANTI_ALIAS_FLAG); roundRect = new RectF(0, 0, getWidth() , getHeight()); radius = 40; mPorterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN) ; } 继承ImageView,在构造方法中调用,初始化Paint和Xfermode. protec

android中把文件保存到sdcard代码实例_Android

直接上代码: package com.example.test; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.os.Bundle; import android.os.Environment; import android.app.Activity; import andr

Android中的广播和广播接收器代码实例_Android

BroadcastReceiver不仅可以接收系统广播,也可接收自定义的广播  1.定义一个广播接收器 复制代码 代码如下: public class MyReceiver extends BroadcastReceiver {          public MyReceiver()          {                    Log.i(TAG,"MyReceiver");          }                  //可用Intent的getActi

Android中使用Service实现后台发送邮件功能实例_Android

本文实例讲述了Android中使用Service实现后台发送邮件功能.分享给大家供大家参考,具体如下: 程序如下: import android.app.Activity; import android.content.Intent; import android.content.res.Resources.NotFoundException; import android.os.Bundle; import android.widget.TextView; public class A05Ac

android中把文件保存到sdcard代码实例

直接上代码: package com.example.test; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.os.Bundle; import android.os.Environment; import android.app.Activity; import andr

Android中的广播和广播接收器代码实例

BroadcastReceiver不仅可以接收系统广播,也可接收自定义的广播   1.定义一个广播接收器 复制代码 代码如下: public class MyReceiver extends BroadcastReceiver {          public MyReceiver()          {                    Log.i(TAG,"MyReceiver");          }                  //可用Intent的getAct

Android中编写属性动画PropertyAnimation的进阶实例_Android

0.基础回顾PropertyAnimation,属性动画,顾名思义就是利用对象的属性变化形成动画的效果.属性动画的类可以用Animator这个抽象类来表示,通常使用它的子类:AnimatorSet和ValueAnimator,同时ValueAnimator有两个子类分别是ObjectAniamtor和TimeAnimator. 定义属性动画的XML资源的时候通常可以是如下三个元素之一作为根元素: <set>元素:该资源元素代表的是AniamtorSet类,这个类可以包含<set>,

Android中创建一个透明的进度对话框实例_Android

首先我们看一下什么叫做透明的进度对话框: 接下来我们讲一下如何创建:1.使用Eclipse创建一个新的Andr​​oid 项目,使用Android 2.2或以上.2.在/res/layout文件夹,创建线性布局activity_main.xml文件,主要是为了添加一个文本标签和一个按钮 复制代码 代码如下: activity_main.xml<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&quo

android中WebView和javascript实现数据交互实例_Android

在看懂这篇文章之前首先要有javascript基础. (1) js调用android的方法: 复制代码 代码如下: WebView wView: wView. addJavascriptInterface (Object obj, String interfaceName); 是实例化一个对象,在html的js中调用,第二个参数是实例化对象的别名,如果要使用这个obj,则在js中使用的名字 就是interfaceName. 复制代码 代码如下: public class jsWebDemo ex