自定义ImageView->StatusImageView
package com.example.customshapedemo; 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.RectF; import android.graphics.drawable.BitmapDrawable; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.ImageView; public class StatusImageView extends ImageView { Paint paint = new Paint(); boolean click_status=false; int color=Color.BLACK; int alpha=100; public StatusImageView(Context context) { super(context); // TODO Auto-generated constructor stub } public StatusImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // TODO Auto-generated constructor stub initParam(context, attrs); } public StatusImageView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub initParam(context, attrs); } // 解析参数 void initParam(Context context, AttributeSet attrs) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.StatusImageView); color= typedArray.getColor(0, Color.BLACK); typedArray.recycle(); } //根据tag来判断绘画点击和未点击的效果 @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub if(click_status){ Bitmap b=((BitmapDrawable)getDrawable()).getBitmap(); //绘制原图 canvas.drawBitmap(b, 0, 0, null); //去去掉锯齿 paint.setAntiAlias(true); //设置颜色 paint.setColor(color); //设置透明度 paint.setAlpha(alpha); //设置层次的类型 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN)); //创建一个同样大小的矩形,然后用画笔遮盖上去 RectF rect = new RectF(0, 0, b.getWidth(), b.getHeight()); canvas.drawRect(rect, paint); }else{ super.onDraw(canvas); } } //更具点击事件,修改Tag,并且重绘界面 @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub System.out.println(color); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: click_status=true; break; case MotionEvent.ACTION_UP: click_status=false; break; default: break; } invalidate(); return true; } }
在values/styles.xml中添加自定义属性:
<declare-styleable name="StatusImageView"> <attr name="color" format="reference|color" /> </declare-styleable>
xml文件中定义使用自定义类 引入namespace,以及用报名+类名的形式使用:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:customshape="http://schemas.android.com/apk/res/com.example.customshapedemo" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <com.example.customshapedemo.CustomImgeView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:layout_marginLeft="28dp" android:layout_marginTop="44dp" android:layout_toRightOf="@+id/textView1" android:src="@drawable/ddw1" customshape:radius="15" customshape:type="round" > </com.example.customshapedemo.CustomImgeView> <com.example.customshapedemo.CustomImgeView android:id="@+id/customImgeView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView1" android:layout_below="@+id/textView1" android:layout_marginTop="119dp" android:src="@drawable/ddw1" customshape:type="circle" /> <com.example.customshapedemo.StatusImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="40dp" android:src="@drawable/ddw1" customshape:color="#FF6103" /> <com.example.customshapedemo.StatusImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/customImgeView1" android:layout_below="@+id/customImgeView1" android:layout_marginLeft="27dp" android:layout_marginTop="22dp" android:src="@drawable/ddw1" customshape:color="#123456" /> </RelativeLayout>