最近挺闲的。对于android的画图机制想了深入了解。发现java的2维画图机制其实也挺强大的。能做出很多我们很炫的效果。此篇文章就讲述了通过cavans 的api 实现三维效果的动态旋转图。

先上效果图:

android中自带的roate旋转使用的是平面旋转。这里我们想要实现立体的旋转圆形。此间我们需要的核心只是就是:
1.画矩形的内切椭圆 2.动态改变矩形半径,并且连续画椭圆。达到圆形旋转的效果 3.判断状态实现圆形旋转前面和背面颜色的切换。

第一步自定义imageview 重写ondraw方法:注释很详细不写了

import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.RectF;import android.util.AttributeSet;import android.widget.ImageView;/** * Created by moram on 2016/11/7. */public class DycmalCircleView extends ImageView{    /**     * 前面颜色     */    private int frontColor;    /**     * 后面颜色     */    private int backColor;    private Paint mPaint=new Paint();    /**     * 当前是前面还是后面     */    private boolean isback=false;    /**     * 变化率 0到100     */    private int changeRate=2;    /** 默认的控件的宽度*/    private int defaultWidth=0;    private int defaultHeight=0;    /**     * 变化的x的长度     */    private int x=0;    /**     * 增加还是减少标志位     */    private boolean add=true;    public DycmalCircleView(Context context) {        super(context);    }    public DycmalCircleView(Context context, AttributeSet attrs) {        super(context, attrs);        setCustomAttributes(context,attrs);    }    public DycmalCircleView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        setCustomAttributes(context,attrs);    }    @Override    protected void onDraw(Canvas canvas) {        if (defaultWidth == 0) {            //获取控件的宽度            defaultWidth = getWidth();        }        if (defaultHeight == 0) {            //获取控件的高度 可用作计算半径            defaultHeight = getHeight();        }        int radius = 0;        //取最小为半径        radius = (defaultWidth < defaultHeight ? defaultWidth                : defaultHeight) / 2;//        canvas.drawRect(60, 90, 160, 100, new Paint());// 长方形        //椭圆所在矩形 Y坐标固定,X左边变化        RectF rectF = new RectF(x, 0, 2*radius - x, 2*radius);        mPaint.setStyle(Paint.Style.FILL);//填充        canvas.drawOval(rectF, mPaint);// 椭圆        if (add && x <= radius) {// X变大即椭圆变小            x = x + changeRate*radius/100;        } else if (x > 0) {// X变小即椭圆变大            if(!isback&& add){ //刚开始变大 则变换颜色并且通过标记位判断颜色                isback=true;                mPaint.setColor(backColor);            }else if(isback && add){                isback=false;                mPaint.setColor(frontColor);            }            x = x -  changeRate*radius/100;            add = false;        } else {            add = true;        }        invalidate();//重新绘制        super.onDraw(canvas);    }    private void setCustomAttributes(Context context,AttributeSet attrs) {        TypedArray a = context.obtainStyledAttributes(attrs,                R.styleable.dycmalCircle);        changeRate = a.getInt(                R.styleable.dycmalCircle_changerate, 2);        frontColor = a                .getColor(R.styleable.dycmalCircle_frontcolor,                        0);        backColor = a.getColor(                R.styleable.dycmalCircle_backcolor, 0);        mPaint.setColor(frontColor);    }}

接下来自定义的style文件:写在attrs中:

<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="dycmalCircle">        <attr name="changerate" format="integer"/>        <attr name="frontcolor" format="color"/>        <attr name="backcolor" format="color"/>    declare-styleable>resources>

接下来在布局中使用就行了:

<com.szh.decymalcircle.DycmalCircleView        android:layout_width="200dp"        android:layout_height="200dp"        dycmalCircle:changerate="2"        dycmalCircle:frontcolor="#00a"        dycmalCircle:backcolor="#0f0"/>不要忘了加上 xmlns:dycmalCircle="http://schemas.android.com/apk/res-auto"

好了做了这些我们就实现了。其实最主要的就是画椭圆的思想。这样就能实现三维旋转的效果了。

下面是github地址:需要的自己看一下。https://github.com/MrHangVIP/DecymalCircle.git

更多相关文章

  1. [置顶] Android(安卓)ListView点击之后保持更换的背景色,实现已读
  2. Qt android 设置系统状态栏为全透明,半透明、全屏,设置状态栏颜色,
  3. 自定义View:Android(安卓)仿 PS 选色板
  4. Android绘图机制与处理技巧(二)——Android图像处理之色彩特效处理
  5. 【移动开发】Android中不用图片资源也能做出好看的界面
  6. 2013.12.05(6)——— android ViewPagerIndicator之SampleTitlesDe
  7. Android视频播放器横竖屏自动切换
  8. Android(安卓)UI 常用颜色
  9. android布局layout边框颜色

随机推荐

  1. android 生成圆角和带倒影图片
  2. In Android(安卓)how to display one vie
  3. android webview ZoomButtonsController
  4. com.android.support:appcompat-v7:15.+.
  5. Android(安卓)读写XML文件(使用pull解析)
  6. Android创建和删除桌面快捷方式
  7. Android作为HTTP服务器--NanoHTTPD源码分
  8. google地图demo
  9. 如何把android设备中的固件dump出来
  10. Android(安卓)播放提示音