画布之ShapeDrawable
package com.loaderman.customviewdemo; import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.Region;
import android.graphics.drawable.ShapeDrawable;
import android.util.AttributeSet;
import android.view.View; public class ShapeView extends View {
private ShapeDrawable mShapeDrawable;
public ShapeView(Context context) {
super(context);
init();
} public ShapeView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
} public ShapeView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
} private void init(){
setLayerType(LAYER_TYPE_SOFTWARE,null);
// //RectShape
// mShapeDrawable = new ShapeDrawable(new RectShape());
// mShapeDrawable.setBounds(new Rect(50,50,200,100));
// mShapeDrawable.getPaint().setColor(Color.YELLOW); // //OvalShape
// mShapeDrawable = new ShapeDrawable(new OvalShape());
// mShapeDrawable.setBounds(new Rect(50,50,200,100));
// mShapeDrawable.getPaint().setColor(Color.YELLOW); // //ArcShape 15968145727
// mShapeDrawable = new ShapeDrawable(new ArcShape(0,300));
// mShapeDrawable.setBounds(new Rect(50,50,200,100));
// mShapeDrawable.getPaint().setColor(Color.YELLOW); // //RoundRectShape
// float[] outerR = new float[] { 12, 12, 12, 12, 0, 0, 0, 0 };
// RectF inset = new RectF(6, 6, 6,6);
// float[] innerR = new float[] { 50, 12, 0, 0, 12, 50, 0, 0 };
// mShapeDrawable = new ShapeDrawable(new RoundRectShape(outerR,inset,innerR));
// mShapeDrawable.setBounds(new Rect(50,50,200,100));
// mShapeDrawable.getPaint().setColor(Color.BLACK); // //PathShape
// Path path = new Path();
// path.moveTo(0,0);
// path.lineTo(100,0);
// path.lineTo(100,100);
// path.lineTo(0,100);
// // 封闭前面点所绘制的路径
// path.close();
// mShapeDrawable = new ShapeDrawable(new PathShape(path,100,200));
// mShapeDrawable.setBounds(new Rect(0,0,250,150));
// mShapeDrawable.getPaint().setColor(Color.YELLOW); //ReginShape
//构造两个矩形
Rect rect1 = new Rect(50,0,90,150);
Rect rect2 = new Rect(0,50,250,100);
//构造两个Region
Region region = new Region(rect1);
Region region2= new Region(rect2);
//取两个区域的交集
region.op(region2, Region.Op.XOR);
mShapeDrawable = new ShapeDrawable(new RegionShape(region));
mShapeDrawable.setBounds(new Rect(0,0,200,100));
mShapeDrawable.getPaint().setColor(Color.YELLOW);
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mShapeDrawable.draw(canvas);
}
}
package com.loaderman.customviewdemo; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Shader;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View; public class TelescopeView extends View {
private Bitmap bitmap;
private ShapeDrawable drawable;
// 放大镜的半径 private static final int RADIUS = 80;
// 放大倍数 private static final int FACTOR = 3;
private final Matrix matrix = new Matrix(); public TelescopeView(Context context) {
super(context);
init();
} public TelescopeView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
} public TelescopeView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
} private void init() {
setLayerType(LAYER_TYPE_SOFTWARE, null);
} @Override
public boolean onTouchEvent(MotionEvent event) {
final int x = (int) event.getX();
final int y = (int) event.getY();
// 这个位置表示的是,画shader的起始位置
matrix.setTranslate(RADIUS - x * FACTOR, RADIUS - y * FACTOR);
drawable.getPaint().getShader().setLocalMatrix(matrix); // bounds,就是那个圆的外切矩形
drawable.setBounds(x - RADIUS, y - RADIUS, x + RADIUS, y + RADIUS);
invalidate();
return true;
} @Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (bitmap == null) {
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.scenery);
bitmap = Bitmap.createScaledBitmap(bmp, getWidth(), getHeight(), false); BitmapShader shader = new BitmapShader(Bitmap.createScaledBitmap(bitmap,
bitmap.getWidth() * FACTOR, bitmap.getHeight() * FACTOR, true),
Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
drawable = new ShapeDrawable(new OvalShape());
drawable.getPaint().setShader(shader);
drawable.setBounds(0, 0, RADIUS * 2, RADIUS * 2);
} canvas.drawBitmap(bitmap, 0, 0, null);
drawable.draw(canvas); } }
效果:

画布之ShapeDrawable的更多相关文章
- Graphics简单汇总
1.主页面布局文件 activity_main.xml(仅仅有2个button按钮) <?xml version="1.0" encoding="utf-8&quo ...
- 安卓自定义控件(二)BitmapShader、ShapeDrawable、Shape
第一篇博客中,我已经Canvas.Paint.Shader.Xfermode这些对象做了总结,而现在这篇文章主要介绍BitmapShader位图渲染,Xfermode如何实际应用,还有形状的绘制.不过 ...
- ShapeDrawable做放大镜效果
引用一下ShapeDrawable的类的说明: java.lang.Object ? android.graphics.drawable.Drawable ? android.grap ...
- 06. Web大前端时代之:HTML5+CSS3入门系列~HTML5 画布
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 我们先看看画布的魅力: 初始画布 canvas默认是宽3 ...
- 如何快速清除ZBrush画布中多余图像
ZBrush是一款数字雕刻与绘画软件,它以强大的功能和直观的工作流程彻底改变了整个三维行业.它的简洁化.智能化和人性化的设计无不让众多用户所折服.刚接触它的用户可能会因为找不到相关命令或不熟悉而觉得它 ...
- 矢量图绘制工具Svg-edit调整画布的大小
矢量图绘制工具Svg-edit调整画布的大小 ------------------------------ ------------------------
- HTML5 中的 canvas 画布(一)
---恢复内容开始--- 在HTML5中新添加的元素,canvas 现在支持 IE9+的版本 注意:HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript ...
- html 5 canvas画布整理
1. 创建canvas画布<canvas id="myCanvas" width="800" height="800" >< ...
- Quartz 2D在ios中的使用简述二:创建画布
在iOS中使用Quartz画图时,第一步就是要获取画布(图形上下文),然后再画布上做各种操作.先看下CoreGraphics.h这个头文件,就可以知道能够创建多少种上下文类型. #include &l ...
随机推荐
- DHCP服务——服务端 和 客户端 配置
转载注明出处:https://www.cnblogs.com/kelamoyujuzhen/p/9520341.html 实验环境 rhel-server-6.4-x86_64-dvd(ED2000 ...
- tomcat部署(一)
Tomcat部署最佳实践 标签: linux 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 tomcat是玩web软件必会技能之一,今天我给大家介绍一下tomc ...
- 牛客网暑期ACM多校训练营(第三场)H Diff-prime Pairs (贡献)
牛客网暑期ACM多校训练营(第三场)H Diff-prime Pairs (贡献) 链接:https://ac.nowcoder.com/acm/contest/141/H来源:牛客网 Eddy ha ...
- Java中的经典算法之快速排序(Quick Sort)
Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...
- 使用Topshelf创建Windows服务[转载]
概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...
- springboot中用来进行查看错误日志的logback文件
<?xml version="1.0" encoding="UTF-8"?> <!-- 从高到地低 OFF . FATAL . ERROR . ...
- KaTex语法说明
参考链接: https://katex.org/docs/supported.html https://github.com/KaTeX/KaTeX/blob/master/docs/supporte ...
- 网站入侵工具 SQL注入神器
0x 00 前言 SQLMAP 0x 01 注入原理 不说了 *****************************************结束分割线********** ...
- XSLT可扩展样式表语言转换 System.Xml.Xsl、XslCompiledTransform类
XML文件 books.xml: <?xml version="1.0" encoding="utf-8" ?> <bookstore> ...
- effective Java 第三版学习笔记
创建对象类型的 1,静态工厂方法代替构造器 静态工厂方法有名称,不容易混乱他的作用 不必再每次调用他的时候创建实例,创建实例的代价是高的,可以重复利用缓存的对象 静态工厂甚至能返回子类对象,例如在接口 ...