2017-05-04 40 views
0

我正在使用Handler延迟后每次调用onDraw我想绘制新的矩形,但是对于每个新的矩形擦除前一个..
如何让画布保持内容所有矩形: 我的代码:绘制多个矩形之间有延迟

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Rect; 
import android.os.CountDownTimer; 
import android.os.Handler; 
import android.util.Log; 

import com.adhamenaya.microchart.model.ChartData; 

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.Map; 

/** 
* Created by Admin on 18/12/2016. 
*/ 

public class ColumnChart extends Chart implements Runnable { 

    private int mSpace = 0; 
    private int mColumnSize = 0; 
    private int mColumnsCount = 0; 
    private int mCurrentStart = 0; 
    private float mHeightUnit = 0; 
    private int mHeightDiff; 
    int columnIndex = 0; 

    private Handler mHandler; 
    private Canvas mCanvas; 
    private Iterator mDataIterator; 

    static final long FRAME_TIME = 100; 
    private ArrayList<Rect> rectangles = new ArrayList<Rect>(); 


    public ColumnChart(Context context) { 
     super(context); 
     mHandler = new Handler(); 
    } 

    @Override 
    protected void prepare() { 
     if (mChartData != null && mChartData.getSingleData().size() > 0) { 
      mColumnsCount = mChartData.getSingleData().size(); 

      // Column size, 1 is added to reserve a space at the end of the chart 
      mColumnSize = (int) ((mWidth/(mColumnsCount)) * 0.9); 

      // Calculate the space between the bars 
      mSpace = (mWidth/mColumnsCount) - mColumnSize; 

      // Calculate height unit 
      // Calculate 80% of the total height 
      float height08 = mHeight * 0.8f; 
      mHeightUnit = height08/mChartData.getMax(); 

      // Draw bars 
      mDataIterator = mChartData.getSingleData().entrySet().iterator(); 

      mMainPaint = getRectPaint(); 


      // Create rect objects 
      while (mDataIterator.hasNext()) { 
       Map.Entry entry = (Map.Entry) mDataIterator.next(); 

       int columnHeight = (int) ((int) entry.getValue() * mHeightUnit); 
       String key = (String) entry.getKey(); 

       // Shift the 
       mCurrentStart += mSpace; 

       // Calculate the difference between the total height and the height of the column 
       mHeightDiff = mHeight - columnHeight; 

       mCurrentStart += mColumnSize; 

       mDataIterator.remove(); 

       Rect rect = new Rect(mCurrentStart, mHeightDiff, 
         mCurrentStart + mColumnSize, mHeight); 
       rectangles.add(rect); 
      } 
     } 
    } 

    @Override 
    protected void paintChart(Canvas canvas) { 

    } 

    @Override 
    public void setData(ChartData data) { 
     this.mChartData = data; 
     prepare(); 
     mHandler.post(this); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 

     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     // Get measured height and width of the view 
     setMeasuredDimension(getMeasurement(widthMeasureSpec, mWidth), 
       getMeasurement(heightMeasureSpec, mHeight)); 

     // mWidth = MeasureSpec.getSize(widthMeasureSpec); 
     // mHeight = MeasureSpec.getSize(heightMeasureSpec); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     if(columnIndex > 0 && columnIndex<rectangles.size()) 
      canvas.drawRect(rectangles.get(columnIndex), getRectPaint()); 
    } 

    @Override 
    public void run() { 

     if(columnIndex<rectangles.size()){ 
      invalidate(); 
      columnIndex++; 
      mHandler.postDelayed(this,FRAME_TIME); 
     }else{ 
      mHandler.removeCallbacks(this); 
     } 
    } 
} 
+0

你在哪里保持r用于绘图? – Krish

回答

0

创建要在其上绘制一个矩形的FrameLayout。每当你画一个新的圆时创建一个视图。在新创建的视图上绘制圆,并将该视图添加到FrameLayout。该视图的背景默认是透明的。如果不是,则将背景设置为透明。这样您的前一个矩形将可见,并且新的矩形将被绘制在现有的矩形上。

0

您即将完成!打电话给invalidate方法后打电话给你。

@Override 
public void run() { 

    if(columnIndex<rectangles.size()){ 
     invalidate(); 
     columnIndex++; 
     mHandler.postDelayed(this,FRAME_TIME); 
    }else{ 
     mHandler.removeCallbacks(this); 
     eraseAll(); 
    } 
} 

...

public void eraseAll() { 
    this.canvas.drawColor(0, PorterDuff.Mode.CLEAR); 
    invalidate(); 
    prepare(); 
} 
+0

在哪里调用eraseAll? –

+0

我编辑的问题,你可以看到。 – matio

+0

我无法得到这个函数的重点eraseAll?我想保留所有已绘制的矩形。 –

0

对我来说,这个逻辑是工作的罚款

@Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     if(columnIndex < rectangles.size()) { 
      for (int i = 0; i <= columnIndex; ++i) { 
       canvas.drawRect(rectangles.get(i), paint); 
      } 
     } 
    } 
0

最简单的挫折感是保持画布对象作为类级别变量,总是这么画布对象上绘制并在super.onDraw()传递在这个画布上,它将始终保持您先前的矩形绘制

+0

你的意思是一个静态变量吗?我做到了,但没有任何改变 –

+0

私人帆布mCanvas; @Override protected void onDraw(Canvas canvas){if(mCanvas == null)mCanvas = canvas; (int i = 0; i <= columnIndex; ++ i){ mCanvas.drawRect(rectangles.get(i),paint); } super.onDraw(mCanvas); } – Sunny