文档章节

Android改变图片颜色的自定义控件(十)

危险游戏
 危险游戏
发布于 2016/02/18 17:04
字数 357
阅读 295
收藏 2

效果如下:

理解: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>

Run

© 著作权归作者所有

危险游戏
粉丝 15
博文 93
码字总数 19385
作品 0
杨浦
Android工程师
私信 提问
转: Android ListView 滑动背景为黑色的解决办法

在Android中,ListView是最常用的一个控件,在做UI设计的时候,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备一张图片然后指定属性 android:back...

vane_
2012/05/25
0
0
Android ListView 滑动背景为黑色的解决办法 listview小知识整理

在别的地方看到的,转过来作为记录!! 在Android中,ListView是最常用的一个控件,在做UI设计的时候,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备...

假装是大神
2012/12/20
0
0
android中listview的一些样式设置

在Android中,ListView是最常用的一个控件,在做UI设计的时候,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备一张图片然后指定属性 android:back...

子曰疯
2013/10/29
0
1
美化你的android程序:自定义ListView背景

在Android中,ListView是最常用的一个控件,在做UI设计的时候,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备一张图片然后指定属性 android:back...

张志浩
2012/08/16
0
0
美化你的android程序:自定义ListView背景

在Android中,ListView是最常用的一个控件,在做UI设计的时候,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备一张图片然后指定属性 android:back...

JavaGG
2009/09/14
2.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring系列教程八: Spring实现事务的两种方式

一、 Spring事务概念: 事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。...

我叫小糖主
今天
5
0
CentOS 的基本使用

1. 使用 sudo 命令, 可以以 root 身份执行命令, 必须要在 /etc/sudoers 中定义普通用户 2. 设置 阿里云 yum 镜像, 参考 https://opsx.alibaba.com/mirror # 备份mv /etc/yum.repos.d/CentO...

北漂的我
昨天
3
0
Proxmox VE技巧 移除PVE “没有有效订阅” 的弹窗提示

登陆的时候提示没有有效的订阅You do not have a valid subscription for this server. Please visit www.proxmox.com to get a list of available options. 用的是免费版的,所以每次都提示......

以谁为师
昨天
3
0
Java设计模式之外观模式(门面模式)

什么是外观模式   外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口...

须臾之余
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部