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. Mysql:[Err] 1630

    Mysql错误 [Err] 1630 . 错误 1630 [SQL]select date_format(now (),'%Y%m%d'); - FUNCTION db.now does not ex ...

  2. 关于Mock的一些网站

    https://github.com/google/googletest/tree/master/googlemock https://blog.csdn.net/hhb200766/article/ ...

  3. HaspMap和ConcurrentHashMap

    参考自:http://www.importnew.com/28263.html HaspMap和ConcurrentHashMap(康科瑞特哈希迈普) Java7 HashMap 不支持并发操作,Ha ...

  4. 使用开发IDE生成一个springboot工程。

    说实话,没办法,大势所趋. 当今天下,大企业,还是小公司,只要有想要更高效率的提高开发效率,能频繁迭代,又影响最小,那么只有使用分布式工程开发. 使用它就因为他快,加载东西,插件快,jar包引入方便. ...

  5. javascript权威指南第22章高级技巧

    HTML <!DOCTYPE html> <html> <head> </head> <body> <div style=" ...

  6. hive 的 beeline用法

    先开启服务端: nohup hive --service metastore & nohup  hive --service hiveserver2 & 进入beeline: beel ...

  7. 12 | 为什么我的MySQL会“抖”一下?

    平时的工作中,不知道你有没有遇到过这样的场景,一条SQL语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短. 看上去,这就像 ...

  8. Docker 学习10 Docker的系统资源限制及验证

    一.资源限制 二.内存限制 1.OOME 每一个进程都会有oom_adj(oom计算分数的权重)值,此值越大,oom_score(oom得分)越高,越容易被干掉,因此非常非常重要的容器化应用,一开始就 ...

  9. iwap:修改菜单树文件

    1.添加mysql数据库连接的jar包. 2.

  10. Educational Codeforces Round 68

    目录 Contest Info Solutions A.Remove a Progression B.Yet Another Crosses Problem C.From S To T D.1-2-K ...