Android自定义ImageView:在图片上添加一个图层

LeoraAnders 8年前
   <p>先看下效果图:</p>    <p><img src="https://simg.open-open.com/show/846e99cd8c61d919957a602b3e7f774a.jpg"></p>    <p style="text-align:center">01.jpg</p>    <p>这是两张前后对比图,右边第二张图里面的已抢光标签图片当已经没有商品的时候就会显示了,在每个图片的中心位置,第一想法是在ImageView的外层再套一层RelativeLayout</p>    <pre>  <code class="language-java"><RelativeLayout        android:layout_width="match_parent"     android:layout_height="wrap_content">   <SelectableRoundedImageView            android:id="@+id/imageView"            style="@style/margin_distance"            android:layout_width="match_parent"            android:layout_height="0dp"            android:layout_weight="1"            android:background="@drawable/youxuan_bg_shape_normol"            android:contentDescription="@string/app_name"            android:padding="1dp"            android:scaleType="centerCrop" />      <ImageView            android:id="@+id/iv_empty_pic"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true" />  </RelativeLayout></code></pre>    <p>这样当然是可以的,然而如果XML布局本身就很复杂,用这样的写法又给View Tree加了一层,不够优雅,下面介绍另一种实现方式:自定义View</p>    <pre>  <code class="language-java">public class CenterImage extends ImageView {      private Paint paint;      private boolean isCenterImgShow;      private Bitmap bitmap;      public void setCenterImgShow(boolean centerImgShow) {             isCenterImgShow = centerImgShow;             if (isCenterImgShow) {                 bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);                 invalidate();             }      }       public CenterImage(Context context) {             super(context);             init();       }      public CenterImage(Context context, AttributeSet attrs) {             super(context, attrs);             init();       }      public CenterImage(Context context, AttributeSet attrs, int defStyleAttr) {              super(context, attrs, defStyleAttr);             init();      }      private void init() {             paint = new Paint();      }      @Override      protected void onDraw(Canvas canvas) {           super.onDraw(canvas);           if (isCenterImgShow && bitmap != null) {                canvas.drawBitmap(bitmap, getMeasuredWidth() / 2 - bitmap.getWidth() / 2, getMeasuredHeight() / 2 - bitmap.getHeight() / 2, paint);           }      }  }</code></pre>    <p>XML中:</p>    <pre>  <code class="language-java"><com.henanjianye.soon.communityo2o.view.CenterImage          android:id="@+id/goodsImage"          android:layout_width="match_parent"         android:layout_height="100dp"         android:layout_alignParentEnd="true"         android:layout_alignParentRight="true"         android:contentDescription="@string/app_name"         android:scaleType="centerCrop"         android:src="@mipmap/yijia_default_bg" /></code></pre>    <p>代码中拿到CenterImage的对象:</p>    <pre>  <code class="language-java">CenterImage mGoodsImg =(CenterImage)findViewById(R.id.GoodsImage);  mGoodsImg.setCenterImgShow(true);</code></pre>    <p>当setCenterImgShow()里的invalidate()方法被调用后,CenterImage的onDraw()方法会重新被调用并重新绘制,这样就可以愉快地在ImageView的上面新加一个图层。</p>    <p> </p>    <p>来自:http://www.jianshu.com/p/a3d9101b3c23</p>    <p> </p>