mmmmayi 2017-08-12 07:07 采纳率: 0%
浏览 2011
已结题

怎样调用匿名内部类及内部类的参数

我最近在使用一个安卓图表插件androidplot,看到别人很多代码都使用了匿名内部类,像这样:

  _ratePlot.setRangeValueFormat(new Format() {

        @Override
        public StringBuffer format(Object obj, @NonNull StringBuffer toAppendTo,
                                   @NonNull FieldPosition pos) {
            double val = ((Number) obj).doubleValue();
            double maxY = _ratePlot.getCalculatedMaxY().doubleValue();

            if (val == 0 || maxY < finalK) {
                return new DecimalFormat("0").format(val, toAppendTo, pos);
            } else if (maxY < finalK * finalK) {
                if (val < 10 * finalK)
                    return new DecimalFormat("0.0 k").format(val / (1000), toAppendTo, pos);
                else
                    return new DecimalFormat("0 k").format(val / (1000), toAppendTo, pos);
            } else {
                if (val < 10 * finalK * finalK)
                    return new DecimalFormat("0.0 M").format(val / (finalK * finalK), toAppendTo, pos);
                else
                    return new DecimalFormat("0 M").format(val / (finalK * finalK), toAppendTo, pos);
            }
        }

        @Override
        public Object parseObject(String source, @NonNull ParsePosition pos) {
            return null;
        }

    });

但是我只看到了定义这个匿名内部类,没有看到在哪里调用,所以有没有大神知道怎样确定参数obj的值,也就是val到底是多少呢?
完整代码:

 package net.i2p.android.router.stats;

import android.graphics.Color; 
import android.os.Bundle; 
import android.os.Handler; 
import android.support.annotation.NonNull; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.androidplot.xy.BarFormatter; 
import com.androidplot.xy.BarRenderer; 
import com.androidplot.xy.BoundaryMode; 
import com.androidplot.xy.XYPlot; 
import com.androidplot.xy.XYSeries; 
import com.androidplot.xy.XYStepMode; 

import net.i2p.android.router.I2PFragmentBase; 
import net.i2p.android.router.R; 
import net.i2p.android.router.service.StatSummarizer; 
import net.i2p.android.router.service.SummaryListener; 
import net.i2p.android.router.util.Util; 

import java.text.DateFormat; 
import java.text.DecimalFormat; 
import java.text.FieldPosition; 
import java.text.Format; 
import java.text.ParsePosition; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Observable; 
import java.util.Observer; 

public class RateGraphFragment extends I2PFragmentBase { 
    // redraws a plot whenever an update is received: 
    private class MyPlotUpdater implements Observer { 
        public void update(Observable o, Object arg) { 
            Util.d("Redrawing plot"); 
            updatePlot(); 
        } 
    } 

    public static final String RATE_NAME = "rate_name"; 
    public static final String RATE_PERIOD = "rate_period"; 

    private Handler _handler; 
    private SetupTask _setupTask; 
    private SummaryListener _listener; 
    private XYPlot _ratePlot; 
    private MyPlotUpdater _plotUpdater; 
    private int _k; 

    public static RateGraphFragment newInstance(String name, long period) { 
        RateGraphFragment f = new RateGraphFragment(); 
        Bundle args = new Bundle(); 
        args.putString(RATE_NAME, name); 
        args.putLong(RATE_PERIOD, period); 
        f.setArguments(args); 
        return f; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        _handler = new Handler(); 
        _setupTask = new SetupTask(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                             Bundle savedInstanceState) { 
        View v = inflater.inflate(R.layout.fragment_graph, container, false); 

        _ratePlot = (XYPlot) v.findViewById(R.id.rate_stat_plot); 

        return v; 
    } 

    @Override 
    public void onStart() { 
        super.onStart(); 
        _handler.removeCallbacks(_setupTask); 
        _handler.postDelayed(_setupTask, 100); 
    } 

    @Override 
    public void onStop() { 
        super.onStop(); 
        if (_listener != null && _plotUpdater != null) { 
            Util.d("Removing plot updater from listener"); 
            _listener.removeObserver(_plotUpdater); 
        } 
        _handler.removeCallbacks(_setupTask); 
    } 

    private class SetupTask implements Runnable { 
        public void run() { 
            String rateName = getArguments().getString(RATE_NAME); 
            long period = getArguments().getLong(RATE_PERIOD); 
            _k = 1000; 
            if (rateName.startsWith("bw.") || rateName.contains("Size") || rateName.contains("Bps") || rateName.contains("memory")) 
                _k = 1024; 

            Util.d("Setting up " + rateName + "." + period); 
            if (StatSummarizer.instance() == null) { 
                Util.d("StatSummarizer is null, delaying setup"); 
                _handler.postDelayed(this, 1000); 
                return; 
            } 
            _listener = StatSummarizer.instance().getListener(rateName, period); 
            if (_listener == null) { 
                Util.d("Listener is null, delaying setup"); 
                _handler.postDelayed(this, 1000); 
                return; 
            } 

            XYSeries rateSeries = _listener.getSeries(); 

            _plotUpdater = new MyPlotUpdater(); 

            _ratePlot.addSeries(rateSeries, new BarFormatter(Color.argb(200, 0, 80, 0), Color.argb(200, 0, 80, 0))); 
            _ratePlot.calculateMinMaxVals(); 
            long maxX = _ratePlot.getCalculatedMaxX().longValue(); 

            Util.d("Adding plot updater to listener"); 
            _listener.addObserver(_plotUpdater); 

            // Only one line, so hide the legend 
            _ratePlot.getLegendWidget().setVisible(false); 

            BarRenderer renderer = (BarRenderer) _ratePlot.getRenderer(BarRenderer.class); 
            renderer.setBarWidthStyle(BarRenderer.BarWidthStyle.VARIABLE_WIDTH); 
            renderer.setBarGap(0); 

            _ratePlot.setDomainUpperBoundary(maxX, BoundaryMode.GROW); 
            _ratePlot.setDomainStep(XYStepMode.INCREMENT_BY_VAL, 15 * 60 * 1000); 
            _ratePlot.setTicksPerDomainLabel(4); 

            _ratePlot.setRangeLowerBoundary(0, BoundaryMode.FIXED); 
            _ratePlot.setTicksPerRangeLabel(5); 

            _ratePlot.setDomainValueFormat(new Format() { 
                private DateFormat dateFormat = SimpleDateFormat.getTimeInstance(DateFormat.SHORT); 

                @Override 
                public StringBuffer format(Object obj, @NonNull StringBuffer toAppendTo, 
                                           @NonNull FieldPosition pos) { 
                    long when = ((Number) obj).longValue(); 
                    Date date = new Date(when); 
                    return dateFormat.format(date, toAppendTo, pos); 
                } 

                @Override 
                public Object parseObject(String s, @NonNull ParsePosition parsePosition) { 
                    return null; 
                } 
            }); 

            final int finalK = _k; 
            _ratePlot.setRangeValueFormat(new Format() { 

                @Override 
                public StringBuffer format(Object obj, @NonNull StringBuffer toAppendTo, 
                                           @NonNull FieldPosition pos) { 
                    double val = ((Number) obj).doubleValue(); 
                    double maxY = _ratePlot.getCalculatedMaxY().doubleValue(); 

                    if (val == 0 || maxY < finalK) { 
                        return new DecimalFormat("0").format(val, toAppendTo, pos); 
                    } else if (maxY < finalK * finalK) { 
                        if (val < 10 * finalK) 
                            return new DecimalFormat("0.0 k").format(val / (1000), toAppendTo, pos); 
                        else 
                            return new DecimalFormat("0 k").format(val / (1000), toAppendTo, pos); 
                    } else { 
                        if (val < 10 * finalK * finalK) 
                            return new DecimalFormat("0.0 M").format(val / (finalK * finalK), toAppendTo, pos); 
                        else 
                            return new DecimalFormat("0 M").format(val / (finalK * finalK), toAppendTo, pos); 
                    } 
                } 

                @Override 
                public Object parseObject(String source, @NonNull ParsePosition pos) { 
                    return null; 
                } 

            }); 

            Util.d("Redrawing plot"); 
            updatePlot(); 
        } 
    } 

    private void updatePlot() { 
        _ratePlot.calculateMinMaxVals(); 
        double maxY = _ratePlot.getCalculatedMaxY().doubleValue(); 
        _ratePlot.setRangeStep(XYStepMode.INCREMENT_BY_VAL, getRangeStep(maxY, _k)); 

        _ratePlot.redraw(); 
    } 

    private double getRangeStep(double maxY, int k) { 
        if (maxY >= k * k) 
            return getRangeStepForScale(maxY, k * k); 
        else if (maxY >= k) 
            return getRangeStepForScale(maxY, k); 
        else 
            return getRangeStepForScale(maxY, 1); 
    } 

    private double getRangeStepForScale(double maxY, int scale) { 
        if (maxY >= 400 * scale) 
            return 40 * scale; 
        else if (maxY >= 200 * scale) 
            return 20 * scale; 
        else if (maxY >= 100 * scale) 
            return 10 * scale; 
        else if (maxY >= 40 * scale) 
            return 4 * scale; 
        else if (maxY >= 20 * scale) 
            return 2 * scale; 
        else if (maxY >= 10 * scale) 
            return scale; 
        else if (maxY >= 4 * scale) 
            return 0.4 * scale; 
        else if (maxY >= 2 * scale) 
            return 0.2 * scale; 
        else 
            return 0.1 * scale; 
    } 
}
  • 写回答

4条回答 默认 最新

  • xiaoxiaohu_Hello 2017-08-12 10:17
    关注

    # 首先,你这个是匿名内部类的使用,重写了方法,你得找到哪个方法使用了Format作为参数,_ratePlot.setRangeValueFormat这个方法你得找到在哪里定义的,在那个方法中会有你要的参数,按Ctrl+单击该方法就能找到在哪定义的了

    评论

报告相同问题?

悬赏问题

  • ¥15 matlab实现基于主成分变换的图像融合。
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊