动态绘制二维图形 ShapeDrawable
2015-12-21 17:09
302 查看
当需要动态的绘制二维图形时,可以用 ShapeDrawable 来完成。可以通过编程的方式绘制初始形状。
ShapeDrawable 是属于 Drawable 的扩展。ShapeDrawable 的构造器如果为空,则默认的为矩形。
效果如下:
MyDrawableView.java :
content_main.xml :
ShapeDrawable 是属于 Drawable 的扩展。ShapeDrawable 的构造器如果为空,则默认的为矩形。
效果如下:
MyDrawableView.java :
package com.scxh.shapedrawabletest; import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.OvalShape; import android.util.AttributeSet; import android.view.View; /** * Created by antimge on 2015/12/21. * 如果只是要随意的绘制一个图形,可省略测量等方法 */ public class MyDrawableView extends View { private ShapeDrawable mDrawable; // 定义图形的长宽(如果图形为 OvalShape ,相等则为圆形,不相等则为椭圆) private final int WIDTH = 160, HEIGHT = 80; public MyDrawableView(Context context) { this(context, null); } public MyDrawableView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyDrawableView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // 设置图形,如果该构造方法为空,则默认显示的是矩形 mDrawable = new ShapeDrawable(new OvalShape()); // 修改默认颜色(默认色为黑色) mDrawable.getPaint().setColor(0xff74AC23); // 设置透明度(半透明) mDrawable.setAlpha(128); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width, height; // 确定内容的理想大小,无约束 int cWidth = 100; int mHeight = 100; width = getHowToGetWH(widthMeasureSpec, cWidth); height = getHowToGetWH(heightMeasureSpec, mHeight); // 使用测量必须调用该方法 setMeasuredDimension(width, height); } /** * 测量宽度和高度的方法 */ private int getHowToGetWH(int measureSpec, int mSize) { int specSize = MeasureSpec.getSize(measureSpec); switch (MeasureSpec.getMode(measureSpec)) { case MeasureSpec.AT_MOST: return Math.min(specSize, mSize); case MeasureSpec.UNSPECIFIED: return mSize; case MeasureSpec.EXACTLY: return specSize; default: return 0; } } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { // 如果有变化,则复位参数 if (w != oldw || h != oldh) { int x = w / 2; int y = h / 2; // 设置边界,否则定义的形状将不会绘制 // 该方法中的 4 个参数都要和定义的 x, y 相关联,该 4 个参数依次为左,上, 右, 下 // 此处居中 mDrawable.setBounds(x - WIDTH, y - HEIGHT, x + WIDTH, y + HEIGHT); } } /** * ShapeDrawable 自己的方法 */ protected void onDraw(Canvas canvas) { mDrawable.draw(canvas); } }
content_main.xml :
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.scxh.shapedrawabletest.MainActivity" tools:showIn="@layout/activity_main"> <com.scxh.shapedrawabletest.MyDrawableView android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
相关文章推荐
- C# 队列(Queue)基础
- 清理缓存
- shell学习(3)-循环语句(for、while、函数)
- Android图片处理
- 计算机网络学习笔记(1)
- [ASP.NET教程] Microsoft Robotics Studio入门系列
- Leetcode 3 - Longest Substring Without Repeating Characters
- ARM2440 LCD实验
- 兔子增长序列(第1届第3题)
- 29.Which two statements are true regarding constraints?
- 链家全解剖:必须佩服、也必须警惕的巨无霸
- Java 泛型类型的一些限制
- 斯坦福机器学习课程 Exercise 习题三
- C/C++面试题大集锦
- Hessian学习笔记之Hessian实例
- 使用maven profile实现多环境可移植构建
- 设计模式六大原则
- oracle 创建唯一索引
- 【Oracle】物理体系结构
- unity5.0材质添加问题