zoukankan      html  css  js  c++  java
  • Android改变图片颜色的自定义控件

    效果如下:

    理解:Xfermode的16总模式如图

    第一步:

    package com.rong.activity;
    
    import com.rong.test.R;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.PorterDuff.Mode;
    import android.graphics.PorterDuffXfermode;
    import android.graphics.Rect;
    import android.graphics.RectF;
    import android.util.AttributeSet;
    import android.view.View;
    /**
     * 改变图片颜色的自定义View
     * @author 徐荣
     *
     */
    public class ChangeImageColorView extends View {
    	Paint mPaint;
    	PorterDuffXfermode xfermode;
    	Bitmap bitmap;
    	int mBitWidth;
    	int mBitHeight;
    	int width;
    	int height;
    	Rect srcRect;
    	Rect dstRect;
    	RectF mRect;
    	int i=0;
    
    	public ChangeImageColorView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		initView();
    	}
    
    	private void initView() {
    		// 初始化画笔
    		mPaint = new Paint();
    		mPaint.setAntiAlias(true);
    		mPaint.setColor(Color.BLUE);
    		// 设置Xfermode
    		xfermode = new PorterDuffXfermode(Mode.SRC_IN);
    		// 获取图片源
    		bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.robot);
    		mBitWidth = bitmap.getWidth();
    		mBitHeight = bitmap.getHeight();
    		
    	}
    
    	@Override
    	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    		super.onSizeChanged(w, h, oldw, oldh);
    		//获取控件的宽高
    		width = w;
    		height = h;
    		srcRect = new Rect(0, 0, width, height);
    		dstRect = new Rect(0, 0, width, height);
    		mRect = new RectF(0, 0, width, height);
    		i=width;
    	}
    
    	@Override
    	protected void onDraw(Canvas canvas) {
    		super.onDraw(canvas);
    		//相当于PS的新建图层
    		int num = canvas.saveLayer(0, 0, width, height, mPaint, Canvas.ALL_SAVE_FLAG);
    		//绘制图片
    		canvas.drawBitmap(bitmap, srcRect, dstRect, mPaint);
    		//设置图片混合模式
    		mPaint.setXfermode(xfermode);
    		//绘制动态区域
    		canvas.drawRect(mRect, mPaint);
    		//恢复混合模式
    		mPaint.setXfermode(null);
    		//合并图层
    		canvas.restoreToCount(num);
    		//更改区域的位置
    		i = i - 1;
    		mRect.top = i;
    		if (i == 0) {
    			i = width;
    		}
    		//刷新UI,他会调用onDraw方法
    		invalidate();
    	}
    
    }

    第二步

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/main_touchlayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        android:orientation="vertical" >
    
        <com.rong.activity.ChangeImageColorView
            android:id="@+id/main_percentview"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_centerInParent="true" />
    
    </RelativeLayout>
  • 相关阅读:
    PowerDesigner快捷键
    Android 的开源电话/通讯/IM聊天项目全集
    Android ContentProvider完整案例
    Android中观察者模式的升入理解
    Android中Socket大文件断点上传
    Storm概念学习系列之Tuple元组(数据载体)
    开始使用storm
    Storm概念学习系列之storm的功能和三大应用
    Storm概念学习系列之storm的特性
    Storm概念学习系列之storm核心组件
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6201504.html
Copyright © 2011-2022 走看看