Android Open Source - markj Pie Layout






From Project

Back to project page markj.

License

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.

Java Source Code

/**
 * /*  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);
  }
}




Java Source Code List

com.markjmind.mobile.api.android.controller.JwAsyncTask.java
com.markjmind.mobile.api.android.controller.JwMapperException.java
com.markjmind.mobile.api.android.controller.JwMemberMapper.java
com.markjmind.mobile.api.android.controller.JwStringID.java
com.markjmind.mobile.api.android.controller.JwViewController.java
com.markjmind.mobile.api.android.controller.JwViewerCache.java
com.markjmind.mobile.api.android.controller.JwViewer.java
com.markjmind.mobile.api.android.controller.Jwc.java
com.markjmind.mobile.api.android.controller.OnClickListenerReceiver.java
com.markjmind.mobile.api.android.controller.ViewerXmlMapper.java
com.markjmind.mobile.api.android.exception.JwErrorCode.java
com.markjmind.mobile.api.android.exception.JwException.java
com.markjmind.mobile.api.android.json.JSONMsgString.java
com.markjmind.mobile.api.android.json.JwJOSNTreeArray.java
com.markjmind.mobile.api.android.json.JwJSONReader.java
com.markjmind.mobile.api.android.ui.JwAnimation.java
com.markjmind.mobile.api.android.ui.JwGroup.java
com.markjmind.mobile.api.android.ui.JwMenu.java
com.markjmind.mobile.api.android.ui.JwOnGroupSelect.java
com.markjmind.mobile.api.android.ui.JwTabGroup.java
com.markjmind.mobile.api.android.ui.JwTouchGroupListener.java
com.markjmind.mobile.api.android.ui.JwTouchGroup.java
com.markjmind.mobile.api.android.ui.JwTouchMotionGroupLisener.java
com.markjmind.mobile.api.android.ui.JwTouchMotionGroup.java
com.markjmind.mobile.api.android.ui.drawgraph.GraphBoard.java
com.markjmind.mobile.api.android.ui.drawgraph.GraphSkin.java
com.markjmind.mobile.api.android.ui.drawgraph.HBackLineSkin.java
com.markjmind.mobile.api.android.ui.drawgraph.LineGraphSkin.java
com.markjmind.mobile.api.android.ui.drawgraph.PieGraph.java
com.markjmind.mobile.api.android.ui.drawgraph.RectGraphSkin.java
com.markjmind.mobile.api.android.ui.drawgraph.SimpleStyle.java
com.markjmind.mobile.api.android.ui.drawgraph.TextArraySkin.java
com.markjmind.mobile.api.android.ui.drawgraph.VBackLineSkin.java
com.markjmind.mobile.api.android.ui.graph.Arc.java
com.markjmind.mobile.api.android.ui.graph.BarElement.java
com.markjmind.mobile.api.android.ui.graph.BarLayout.java
com.markjmind.mobile.api.android.ui.graph.Bar.java
com.markjmind.mobile.api.android.ui.graph.IPieSkin.java
com.markjmind.mobile.api.android.ui.graph.LineLayout.java
com.markjmind.mobile.api.android.ui.graph.MeasureLayout.java
com.markjmind.mobile.api.android.ui.graph.PieArcRoundSkin.java
com.markjmind.mobile.api.android.ui.graph.PieLayout.java
com.markjmind.mobile.api.android.ui.graph.PiePercentSkin.java
com.markjmind.mobile.api.android.ui.view.JwBaseDropDown.java
com.markjmind.mobile.api.android.ui.view.JwDropDown.java
com.markjmind.mobile.api.android.ui.view.JwSlidingLayout.java
com.markjmind.mobile.api.android.ui.view.JwWheelView.java
com.markjmind.mobile.api.android.ui.view.StickerListener.java
com.markjmind.mobile.api.android.ui.view.StickerView.java
com.markjmind.mobile.api.android.ui.view.textview.JwTextViewAutoScale.java
com.markjmind.mobile.api.android.ui.view.textview.JwTextViewFonts.java
com.markjmind.mobile.api.android.ui.view.textview.JwTextViewWrapScale.java
com.markjmind.mobile.api.android.ui.wrapper.JwAlertDialog.java
com.markjmind.mobile.api.android.ui.wrapper.JwToast.java
com.markjmind.mobile.api.android.util.JwFile.java
com.markjmind.mobile.api.android.util.JwPreferenceList.java
com.markjmind.mobile.api.android.util.JwPreference.java
com.markjmind.mobile.api.android.util.JwSound.java
com.markjmind.mobile.api.android.util.JwTextUtils.java
com.markjmind.mobile.api.android.util.PhoneInfo.java
com.markjmind.mobile.api.android.util.WebConnection.java
com.markjmind.mobile.api.android.xml.JwDomHandler.java
com.markjmind.mobile.api.android.xml.JwDomLoader.java
com.markjmind.mobile.api.android.xml.JwEditElementHandler.java
com.markjmind.mobile.api.android.xml.JwXmlLoader.java
com.markjmind.mobile.api.android.xml.JwXmlResoure.java
com.markjmind.mobile.api.hub.ArrayJDhub.java
com.markjmind.mobile.api.hub.DBhub.java
com.markjmind.mobile.api.hub.JDhub.java
com.markjmind.mobile.api.hub.Loader.java
com.markjmind.mobile.api.hub.StoreList.java
com.markjmind.mobile.api.hub.Store.java