Back to project page markj.
The source code is released under:
GNU Lesser General Public License
If you think the Android project markj listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
/** * /* w ww . j ava2s. c o m*/ */ package com.markjmind.mobile.api.android.ui.graph; import java.util.ArrayList; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.EmbossMaskFilter; import android.os.SystemClock; import android.util.AttributeSet; import android.widget.FrameLayout; /** * ?????? ???? ?????? ?????????.<br> * LinearLayout??? ?????? ?????? <br> * ???????? ???? ?? ??????? ???? Layout ????? ????.<br> * Layout??? ??? layer?? ?????? ????.<br> * ???????? ?? add(??)?? ????? ???? ??????.<br> * @author ??? * */ public class PieLayout extends FrameLayout{ public float density; private boolean isSizeToScale = true; private float strokScale = 1.0f; private int strokSize = -1; private boolean isBackArc = false; private Arc backArc; private int arcMargin=0; private float startAngle=0; private float maxAngle=360; private boolean isCapRound = false; private boolean isEmboos = false; private EmbossMaskFilter emboss; public ArrayList<Arc> arcs = new ArrayList<Arc>(); private ArrayList<IPieSkin> pieSkin = new ArrayList<IPieSkin>(); private boolean isInitpieSkin = false; private int percent = 0; /** * LinearLayout ????????? ????? * @param context */ public PieLayout(Context context) { super(context); init(); } /** * LinearLayout ????????? ????? * @param context * @param attrs */ public PieLayout(Context context, AttributeSet attrs) { super(context, attrs); init(); } /** * ??? ??? */ public void init(){ super.setWillNotDraw(false); isSizeToScale = true; strokSize = -1; isBackArc = false; Arc backArc; arcMargin=0; startAngle=0; maxAngle=360; isCapRound = false; emboss = new EmbossMaskFilter(new float[]{-1,-1,1},0.7f,3,4); isInitpieSkin = false; density = getContext().getResources().getDisplayMetrics().density; strokScale = 1.0f; if(arcs.size()>0 || pieSkin.size()>0){ pieSkin.clear(); arcs.clear(); this.invalidate(); } } public void isBackArc(boolean isBackArc){ this.isBackArc = isBackArc; } public Arc setBackArc(float start, float end, int color){ if(backArc==null){ backArc = new Arc(this); } backArc.setArc(start, end, color); backArc.setCapRound(isCapRound); if(isEmboos){ backArc.setMaskFilter(emboss); } backArc.setColor(color); invalidate(); return backArc; } public void isEmboos(boolean isEmboos){ this.isEmboos = isEmboos; } public void setEmboss(EmbossMaskFilter emboss){ this.emboss = emboss; } public Arc getBackArc(){ return backArc; } /** * Layout??? ?????? Canvas? ??<br> * ?????? ?????? Layout?? ???? ????. */ public void onDraw(Canvas canvas){ super.onDraw(canvas); if(isBackArc){ backArc.setStrokSize(getStrokSize()); backArc.setSize(this.getWidth(), this.getHeight(),this.arcMargin); backArc.draw(canvas); } for(int i=0;i<arcs.size();i++){ Arc arc = (Arc)arcs.get(i); arc.setStrokSize(getStrokSize()); if(!isInitpieSkin){ for(int j=0;j<pieSkin.size();j++){ pieSkin.get(j).init(this); } isInitpieSkin = true; } arc.setSize(this.getWidth(), this.getHeight(),this.arcMargin); arc.draw(canvas); for(int j=0;j<pieSkin.size();j++){ pieSkin.get(j).draw(this, canvas, startAngle, maxAngle, arc.start, arc.end, i); } } } /** * Layout??? ?????? Canvas? ??<br> * ?????? ?????? Layout?? ???? ????. */ @Override public void draw(Canvas canvas) { super.draw(canvas); }; private ArrayList<Thread> threadPool = new ArrayList<Thread>(); /** * ???? ???? ???????? ??? ????. * @param arcIndex ???? ???? ??????? */ public void animStart(int arcIndex){ for(int i=0;i<threadPool.size();i++){ threadPool.get(i).interrupt(); } threadPool.clear(); Thread thread = new Thread(new AnimDraw(arcIndex)); threadPool.add(thread); thread.start(); } public void animStart(boolean syc){ for(int i=0;i<threadPool.size();i++){ threadPool.get(i).interrupt(); } threadPool.clear(); if(syc){ Thread thread = new Thread(new AnimDraw()); threadPool.add(thread); thread.start(); }else{ for(int i=0;i<arcs.size();i++){ Thread thread = new Thread(new AnimDraw(i)); threadPool.add(thread); thread.start(); } } } public void animStart(){ animStart(true); } /** * ??????????? ??????? ?????? * ???????? Thread ????? * @author ??? * */ private class AnimDraw implements Runnable{ int frame = 150; int index=-1; public AnimDraw(int index){ this.index = index; } public AnimDraw(){ } public void run(){ if(index>=0){ animDraw(index); }else{ animDraw(); } } private void animDraw(int index){ Arc arc = arcs.get(index); animDraw(frame,arc); } private void animDraw(){ float allEnd=0; float preEnd = 0; float ends[] = new float[arcs.size()]; for(int i=0;i<arcs.size();i++){ Arc arc = arcs.get(i); ends[i]= arc.end; allEnd = allEnd + arc.end; arc.end=0; } postInvalidate(); for(int i=0;i<arcs.size();i++){ if(!Thread.currentThread().isInterrupted()){ Arc arc = arcs.get(i); arc.end = ends[i]; int currFrame = Math.round(frame*(arc.end/allEnd)); animDraw(currFrame,arc); }else{ return; } } } private void animDraw(int currFrame,Arc arc){ float temp_end = arc.end; for(int j=0;j<currFrame;j++){ if(!Thread.currentThread().isInterrupted()){ arc.end = temp_end*j/currFrame; postInvalidate(); if(j!=0){ SystemClock.sleep(10); } }else{ return; } } arc.end=temp_end; postInvalidate(); } } public void setSizeToScale(boolean isSizeToScale){ this.isSizeToScale = isSizeToScale; } /** * ????? ???? ???? ???. * @return ???? ???????? */ public int getStrokSize(){ if(isSizeToScale){ float width = getWidth(); float height = getHeight(); float strok; if(width < height){ strok = width; }else{ strok = height; } strok=strok/2*strokScale; return (int)strok; }else{ return strokSize; } } public void setStrokSize(int size){ strokSize=(int)(size*density); } /** * ????(?????)??? ?????(?????)??<br> * ?? ??? ???? ?? ????.<br> * EX) PieLayout.addArc(0,10,blue).addArc(10,20,red).addArc(20,50,gray); <--?? 3??? * @param start ????(?????) * @param end ?????(?????) * @param color ?? * @param isInvalidate reFresh ?? * @return ????? ?????? Arc ??? */ public Arc addArc(float start, float angle, int color,boolean isInvalidate){ Arc arc = new Arc(this); arc.setCapRound(isCapRound); if(isEmboos){ arc.setMaskFilter(emboss); } arc.setArc(start, angle, color); arcs.add(arc); if(isInvalidate){ invalidate(); } return arc; } public Arc addArc(int percent, int color,boolean isInvalidate){ float cap = Math.round(maxAngle - startAngle); float curr = Math.round(cap*percent/100) ; this.percent = percent; if(curr > cap ) { curr = cap; } return addArc(this.startAngle, curr, color, isInvalidate); } /** * ????(?????)??? ?????(?????)??<br> * ?? ??? ???? ?? ????.<br> * EX) PieLayout.addArc(0,10,blue).addArc(10,20,red).addArc(20,50,gray); <--?? 3??? * @param start ????(?????) * @param end ?????(?????) * @param color ?? * @return ????? ?????? Arc ??? */ public Arc addArc(float start, float angle, int color){ Arc arc = new Arc(this); arc.setCapRound(isCapRound); arc.setArc(start, angle, color); arcs.add(arc); invalidate(); return arc; } public Arc addArc(int percent, int color){ return addArc(percent, color ,true); } /** * ????? ??????? ????? ?? * @param strokScale ? ??? ?????? */ public void setScale(float strokScale){ this.strokScale = strokScale; } /** * ????? ???????? ????????? ????? * @return ?????? */ public float getStrokScale(){ return this.strokScale; } /** * ????? ???? ?????(Arc)? ????. * @param index * @return Arc ??? */ public Arc getArc(int index){ return arcs.get(index); } /** * ??? Arc???? ????. * @return Arc ??? */ public Arc getArc(){ if(arcs.size()>0){ return arcs.get(0); }else{ return null; } } /** * ??????? ??? ????. * @return */ public int getArcCount(){ return arcs.size(); } public void setMaxAngle(float startAngle, float maxAngle){ this.startAngle = startAngle; this.maxAngle = maxAngle; } public float getStartAngle(){ return this.startAngle; } public float getMaxAngle(){ return this.maxAngle; } public void setMarginArc(int margin){ arcMargin = (int)(margin*density); } public int getMaginArc(){ return arcMargin; } public void addPieSkin(IPieSkin ps){ pieSkin.add(ps); } public ArrayList getPieSkin(){ return pieSkin; } public void setCapRound(boolean isCapRound){ this.isCapRound = isCapRound; for(int i=0;i<arcs.size();i++){ Arc arc = arcs.get(i); arc.setCapRound(isCapRound); } } public Arc setCapRound(boolean isCapRound, int index){ Arc arc = arcs.get(index); return arc.setCapRound(isCapRound); } public void setMaskFilter(EmbossMaskFilter emboss){ for(int i=0;i<arcs.size();i++){ Arc arc = arcs.get(i); arc.setMaskFilter(emboss); } } public Arc setMaskFilter(EmbossMaskFilter emboss, int index){ Arc arc = arcs.get(index); return arc.setMaskFilter(emboss); } }