重绘完成后的Highcharts事件处理程序

时间:2018-09-16 17:05:13

标签: highcharts

我试图将Y轴的总和显示为HighStock图表的副标题。 最初是通过将“ load”事件中所有系列的point.y值相加来完成的,如下所示:

using Android.App;
using Android.Widget;
using Android.OS;
using Android.Support.V7.App;
using Java.IO;
using Javax.Crypto;
using Javax.Crypto.Spec;
using System;
using System.IO;
using Java.Net;
using System.Threading.Tasks;

namespace SecretCalc
{
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", 
MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
    VideoView video;
    Button encrypt, decrypt;
    private string sKey = "0123456789abcdef";//key,
    private string ivParameter = "1020304050607080";
    string path = "/sdcard/Download/";
    string destpath = "/sdcard/test/";
    string filename = "video1.mp4";
    Stream outputStream;
    string date = "20180922153533.mp4"; // Already Encrypted File Name

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);

        video = FindViewById<VideoView>(Resource.Id.videoView);
        encrypt = FindViewById<Button>(Resource.Id.btnEncrypt);
        decrypt = FindViewById<Button>(Resource.Id.btnDecrypt);

        encrypt.Click += Encrypt_Click;
        decrypt.Click += Decrypt_ClickAsync;
    }


    private async void Decrypt_ClickAsync(object sender, EventArgs e)
    {
        video.SetVideoPath("http://0.0.0.0:9990/");
        video.Prepared += Video_Prepared;

        await Task.Run(() =>
        {
            try
            {
                ServerSocket serverSocket = new ServerSocket();
                serverSocket.Bind(new InetSocketAddress("0.0.0.0", 9990));

                // this is a blocking call, control will be blocked until client sends the request
                Socket finalAccept = serverSocket.Accept();
                outputStream = finalAccept.OutputStream;
            }
            catch (Exception ex)
            {
            }
        });

        await Task.Run(() => DecryptThroughSocket());

    }

    private void Video_Prepared(object sender, EventArgs e)
    {
        video.Start();
    }

    private bool DecryptThroughSocket()
    {
        try
        {
            byte[] raw = System.Text.Encoding.Default.GetBytes(sKey);
            byte[] iv = System.Text.Encoding.Default.GetBytes(ivParameter);

            int count = 0, pos = 0, total = 0, readbyte;

            byte[] data = new byte[1024 * 1024];
            readbyte = data.Length;
            long lenghtOfFile = new Java.IO.File(Path.Combine(path, date)).Length();

            FileInputStream inputStream = new FileInputStream(Path.Combine(destpath, date));

            while ((count = inputStream.Read(data, 0, readbyte)) != -1)
            {
                if (count < readbyte)
                {
                    if ((lenghtOfFile - total) > readbyte)
                    {
                        while (true)
                        {
                            int seccount = inputStream.Read(data, pos, (readbyte - pos));
                            pos = pos + seccount;
                            if (pos == readbyte)
                            {
                                break;
                            }
                        }
                    }
                }

                // encrypt data read before writing to output stream
                byte[] decryptedData = decryptFun(raw, iv, data);
                outputStream.Write(decryptedData,0,decryptedData.Length);
            }
        }
        catch (Exception ex)
        {

            return false;
        }
        return true;
    }

    private void Encrypt_Click(object sender, EventArgs e)
    {
        try
        {
            FileInputStream inputStream = new FileInputStream(System.IO.Path.Combine(path, filename));

            date = DateTime.Now.ToString("yyyyMMddHHmmss") + ".mp4";

            DirectoryInfo dir = new DirectoryInfo(destpath);

            if (!dir.Exists)
            {
                Directory.CreateDirectory(destpath);
            }

            FileOutputStream outputStream = new FileOutputStream(System.IO.Path.Combine(destpath, date));

            byte[] raw = System.Text.Encoding.Default.GetBytes(sKey);
            byte[] iv = System.Text.Encoding.Default.GetBytes(ivParameter);

            int count = 0, pos = 0, total = 0, readbyte;

            byte[] data = new byte[1024 * 1024];
            readbyte = data.Length;
            long lenghtOfFile = new Java.IO.File(Path.Combine(path, filename)).Length();

            while ((count = inputStream.Read(data, 0, readbyte)) != -1)
            {
                if (count < readbyte)
                {
                    if ((lenghtOfFile - total) > readbyte)
                    {
                        while (true)
                        {
                            int seccount = inputStream.Read(data, pos, (readbyte - pos));
                            pos = pos + seccount;
                            if (pos == readbyte)
                            {
                                break;
                            }
                        }
                    }
                }

                total += count;

                // encrypt data read before writing to output stream
                byte[] encryptedData = encryptFun(raw, iv, data);
                outputStream.Write(encryptedData);
            }
        }
        catch (Exception ex)
        {
        }
    }

    public static byte[] encryptFun(byte[] key, byte[] iv, byte[] clear)
    {
        SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.GetInstance("AES/CTR/NoPadding");

        IvParameterSpec ivspec = new IvParameterSpec(iv);

        cipher.Init(CipherMode.EncryptMode, skeySpec, ivspec);
        byte[] encrypted = cipher.DoFinal(clear);
        return encrypted;
    }

    public static byte[] decryptFun(byte[] key, byte[] iv, byte[] encrypted)
    {
        SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.GetInstance("AES/CTR/NoPadding");

        IvParameterSpec ivspec = new IvParameterSpec(iv);
        cipher.Init(CipherMode.DecryptMode, skeySpec, ivspec);

        byte[] decrypted = cipher.DoFinal(encrypted);
        return decrypted;
    }
}
}

现在,在使用导航器或范围选择器更改时间范围后,在重绘图表后,我需要更新总计。我知道有一个“重绘”事件,但这将使我陷入无限循环。我应该参加哪个活动?

2 个答案:

答案 0 :(得分:0)

您可以使用redraw事件,而不必在未完成的重绘中重绘。例如:

chart: {
    events: {
        redraw: function () {
            this.update({
                subtitle: { text: 'TOTAL:  ' + seriesSum }
            }, false);
        }
    }
}

请注意Chart.update函数的false参数,以防止进一步重画(无限循环)。

使用Highcharts和redraw事件查看this JSFiddle demonstration

答案 1 :(得分:0)

您可以在update事件中使用带有redraw标志的redraw方法,但是必须设置正确的条件以免陷入无限循环:

var redrawEnabled = true;

var chart = Highcharts.chart('container', {
    chart: {
        zoomType: 'x',
        events: {
            redraw: function() {
                if (redrawEnabled) {
                    var sum = 0;
                    redrawEnabled = false;

                    Highcharts.each(this.series[0].points, function(point) {
                        if (point.isInside) {
                            sum += point.y;
                        }
                    });

                    this.update({
                        subtitle: {
                            text: sum
                        }
                    });

                    redrawEnabled = true;
                }
            }
        }
    },
    series: [{
        data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
    }]
});

实时演示:http://jsfiddle.net/BlackLabel/dewumkz6/