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的更多相关文章

  1. Graphics简单汇总

    1.主页面布局文件 activity_main.xml(仅仅有2个button按钮) <?xml version="1.0" encoding="utf-8&quo ...

  2. 安卓自定义控件(二)BitmapShader、ShapeDrawable、Shape

    第一篇博客中,我已经Canvas.Paint.Shader.Xfermode这些对象做了总结,而现在这篇文章主要介绍BitmapShader位图渲染,Xfermode如何实际应用,还有形状的绘制.不过 ...

  3. ShapeDrawable做放大镜效果

    引用一下ShapeDrawable的类的说明: java.lang.Object    ? android.graphics.drawable.Drawable      ? android.grap ...

  4. 06. Web大前端时代之:HTML5+CSS3入门系列~HTML5 画布

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 我们先看看画布的魅力: 初始画布 canvas默认是宽3 ...

  5. 如何快速清除ZBrush画布中多余图像

    ZBrush是一款数字雕刻与绘画软件,它以强大的功能和直观的工作流程彻底改变了整个三维行业.它的简洁化.智能化和人性化的设计无不让众多用户所折服.刚接触它的用户可能会因为找不到相关命令或不熟悉而觉得它 ...

  6. 矢量图绘制工具Svg-edit调整画布的大小

    矢量图绘制工具Svg-edit调整画布的大小 ------------------------------ ------------------------

  7. HTML5 中的 canvas 画布(一)

    ---恢复内容开始--- 在HTML5中新添加的元素,canvas 现在支持 IE9+的版本 注意:HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript ...

  8. html 5 canvas画布整理

    1. 创建canvas画布<canvas id="myCanvas" width="800" height="800" >< ...

  9. Quartz 2D在ios中的使用简述二:创建画布

    在iOS中使用Quartz画图时,第一步就是要获取画布(图形上下文),然后再画布上做各种操作.先看下CoreGraphics.h这个头文件,就可以知道能够创建多少种上下文类型. #include &l ...

随机推荐

  1. spice在桌面虚拟化中的应用系列之一(spice简介,性能优化等)

    1.spice介绍 1.1 spice简介 spice是由Qumranet开发的开源网络协议,2008年红帽收购了Qumranet获得了这个协议.SPICE是红帽在虚拟化领域除了KVM的又一“新兴技术 ...

  2. Linux文件系统概览

    三 Linux文件系统概览 3.1 Linux文件系统简介 在Linux操作系统中,所有被操作系统管理的资源,例如网络接口卡.磁盘驱动器.打印机.输入输出设备.普通文件或是目录都被看作是一个文件. 也 ...

  3. Nginx练习练习玩玩

    Date:2019-11-9 读前思考: 对于NGINX,一般会问什么? 面试官会从哪方面入手? 面试官到底想考察什么? 你做好准备了吗? 如果对于初学者,往往可以通过面试题来提升对某一个技术的了解和 ...

  4. 编写一个求圆面积的C语言程序

    #include<stdio.h>   //文件包含//#define PI 3.14     //宏定义//void main()         { float r,s; scanf( ...

  5. sysobjects统计数据库的各类结构数据

    概要: 查询表.以及表中的行数 SELECT a.name,b.rows FROM sysobjects a INNER JOIN sysindexes b ON a.id=b.id WHERE a. ...

  6. ElasticSearch 集群环境搭建,安装ElasticSearch-head插件,安装错误解决

    ElasticSearch-5.3.1集群环境搭建,安装ElasticSearch-head插件,安装错误解决 说起来甚是惭愧,博主在写这篇文章的时候,还没有系统性的学习一下ES,只知道可以拿来做全文 ...

  7. umeditor+粘贴word图片

    图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码 目前限chrome浏览器使用,但是项目要求需要支持所有的浏览器,包括Windows和macOS系统.没有办 ...

  8. learning scala dependency injection

    println("Step 1: Create a trait which knows how to do create, read, update and delete operation ...

  9. Hdu CRB and Queries(整体二分)

    CRB and Queries Time Limit: 6000 MS Memory Limit: 131072 K Problem Description There are N boys in C ...

  10. 【luogu3950】部落冲突--树剖

    题目背景 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多 ...