精华内容
下载资源
问答
  • 真正的能理解CSS中的line-height,height与line-height

    万次阅读 多人点赞 2018-09-20 15:48:21
    在最近的项目中,常常用到line-height,只是简单的理解为行高但并没有深层次的理解,致使不能达到信手拈来的感觉。在此做一下总结,一是更深层次的了解什么是line-height,二是比较height与line-height的区别。 基本...

    在最近的项目中,常常用到line-height,只是简单的理解为行高但并没有深层次的理解,致使不能达到信手拈来的感觉。在此做一下总结,一是更深层次的了解什么是line-height,二是比较height与line-height的区别。

    基本概念

    行高与行距从字面的意思是非常容易理解的,但是对布局和样式来说,我们应该更深入的理解各个属性之间的关系,比如line-height与font-size存在什么关系呢,line-height与所属元素的height又有什么联系呢?。好了,带着疑问,我们一同探究。
    行高是指文本行基线间的垂直距离。 基线(base line)并不是汉字文字的下端沿,而是英文字母“x”的下端沿。下图中两条红线之间的距离就是行高,上行的底线和下一行顶线之间的距离就是行距,而同一行顶线和底线之间的距离是font-size的大小,行距的一半是半行距。
    在这里插入图片描述
    从上图我们就可以看出,行距、font-size与line-height之间的关系了吧。接下来进一步来看看这三者关系
    在这里插入图片描述
    当font-size等于line-height时,行距 = line-height - font-size = 0;而当font-size大于line-height时,则会出现行距为负值,则两行重叠,如下图:
    在这里插入图片描述
    关于CSS boxes的四种类型(containing boxes、inline boxes、line boxes、content area)和line-height五种取值方法(line-height:normal;、line-height:inherit;、line-height:120%;、line-height:25px;、line-height:1.2)。参见以下资料:
    深入了解css的行高Line Height属性
    [学习笔记] css中的line-height
    接下来将讲一讲height和line-height的联系
    CSS中起高度作用的应该就是height以及line-height。height是用来设置元素的高度,比如img的高度、div的高度等。以一个div为例,来进一步说明两个问题:
    第一个问题:如果不设置div的高度时,是div的font-size决定了div的高度还是line-weight的值。不防来写段代码进行直观的说明

    CSS:
        .test1{font-size:20px; text-align:center;line-height:0; border:1px solid black; background: red;} 
    html:
    	<div class="test1">测试</div>
    

    显示结果(图1):
    在这里插入图片描述

    CSS:
        .test2{font-size:1px; text-align:center;line-height:20px; border:1px solid black; background:red;}
    html:
    	  <div class="test2">测试</div>
    

    显示结果(图2):
    在这里插入图片描述
    由图1和图2可知,在没有设置div的height属性时,div的高度根据line-height的大小而变化,且文字垂直居中。
    第二问题:div的height与line-height的大小关系不同时,会有什么显示结果呢?
    (1)height = line-height时
    在这里插入图片描述
    (2)height>line-height时
    在这里插入图片描述
    (3)height<line-height时
    在这里插入图片描述
    可以通过“测试”两个字在页面上的位置,能反映出height与line-height的大小关系。如果通过上面的学习,没有疑问的话,可以说初步理解了line-height。
    如若以上并没有使你柳暗花明,敬请谅解,如果有什么问题,可留言我们讨论。

    展开全文
  • Citrix Online Plugin Web

    热门讨论 2012-10-17 16:16:00
    Citrix Online Plugin Web 安装程序
  • 目录 零、简介 一、MpAndroidChart的基本使用 1.依赖:project的build....二、MpAndroidChart-LineChart的基本使用配置 1.XAxis(X轴) 2.YAxis(Y轴) 3.Legend(图例:即上图所示的曲线图下面的 温度) 4.Desc...

    目录

    零、简介

    一、MpAndroidChart的基本使用

    1.依赖:project的build.gradle 中添加

    2.app的build.gradle 中添加

    3.举例

    4.常用API

    二、MpAndroidChart-LineChart的基本使用配置

    1.XAxis(X轴)

    2.YAxis(Y轴)

    3.Legend(图例:即上图所示的曲线图下面的 温度)

    4.Description(描述)

    5.MarkerView

    6.折线图的线条设置

    三、LineChart实现动态添加曲线,以及多曲线动态添加数据

    1. 在xml中添加基本控件

    2.初始化基本属性,控件

    3. 初始化折线:initLineChart()

    4. 设置图标基本属性:setChartBasicAttr()

    5. 设置XY轴:setXYAxis()

    6.初始化LineDataSet(一条曲线):initLineDataSet()

    7.动态创建并添加一个线条:createLine()

    8. 初始化项目中的三条折线:initLine()

    9. 设置图例:createLegend()

    10. 设置MarkerView: setMarkerView()

    11.动态添加数据点:addEntry()

    12.自定义Handler:DemoHandler

    13. 点击事件:onClick()

    14.最后一步,回收:onDestory

    四、全部Java代码


    零、简介

    本文主要介绍MpAndroidChart中的折线图-LineChart的基本使用,包含动态添加点,动态添加线,以及曲线的隐藏与显示等等。

    话不多说,先上图:

                 

     

    GitHub地址:https://github.com/PhilJay/MPAndroidChart

    文档地址:https://jitpack.io/com/github/PhilJay/MPAndroidChart/v3.0.2/javadoc

    一、MpAndroidChart的基本使用

    1.依赖:project的build.gradle 中添加

    allprojects {
        repositories {
            jcenter()
            maven { url "https://jitpack.io" }
        }
    }

    2.app的build.gradle 中添加

    implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0-alpha'

    3.举例

    3.1 xml中示例

    <com.github.mikephil.charting.charts.LineChart
        android:id="@+id/mvDetailLineChart"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp200"/>

    3.2 java代码示例

    @Override
    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        LineChart mLineChart = (LineChart) findViewById(R.id.lineChart);
        //显示边界
        mLineChart.setDrawBorders(true);
        //设置数据
        List<Entry> entries = new ArrayList<>();
        for (int i = 0; i < 10; i++) { 
            entries.add(new Entry(i, (float) (Math.random()) * 80));
        } //一个LineDataSet就是一条线
        LineDataSet lineDataSet = new LineDataSet(entries, "温度");
        LineData data = new LineData(lineDataSet);
        mLineChart.setData(data);
    }
    

    3.3 效果图:

    4.常用API

    • setDescription(String desc) : 设置表格的描述
    • setDescriptionTypeface(Typeface t) :自定义表格中显示的字体
    • setDrawYValues(boolean enabled) : 设置是否显示y轴的值的数据
    • setValuePaintColor(int color) :设置表格中y轴的值的颜色,但是必须设置setDrawYValues(true)
    • setValueTypeface(Typeface t):设置字体
    • setValueFormatter(DecimalFormat format) : 设置显示的格式
    • setPaint(Paint p, int which) : 自定义笔刷
    • public ChartData getDataCurrent() :返回ChartData对象当前显示的图表。它包含了所有信息的显示值最小和最大值等
    • public float getYChartMin() : 返回当前最小值
    • public float getYChartMax() : 返回当前最大值
    • public float getAverage() : 返回所有值的平均值。
    • public float getAverage(int type) : 返回平均值
    • public PointF getCenter() : 返回中间点
    • public Paint getPaint(int which) : 得到笔刷
    • setTouchEnabled(boolean enabled) : 设置是否可以触摸,如为false,则不能拖动,缩放等
    • setDragScaleEnabled(boolean enabled) : 设置是否可以拖拽,缩放
    • setOnChartValueSelectedListener(OnChartValueSelectedListener l) : 设置表格上的点,被点击的时候,的回调函数
    • setHighlightEnabled(boolean enabled) : 设置点击value的时候,是否高亮显示
    • public void highlightValues(Highlight[] highs) : 设置高亮显示
    • saveToGallery(String title) : 保存图表到图库中
    • saveToPath(String title, String pathOnSD) : 保存.
    • setScaleMinima(float x, float y) : 设置最小的缩放
    • centerViewPort(int xIndex, float val) : 设置视口
    • fitScreen() : 适应屏幕

    动画:

    所有的图表类型都支持下面三种动画,分别是x方向,y方向,xy方向。

    • animateX(int durationMillis) : x轴方向
    • animateY(int durationMillis) : y轴方向
    • animateXY(int xDuration, int yDuration) : xy轴方向

    二、MpAndroidChart-LineChart的基本使用配置

    使用MpAndroidchart前首先要明白几个概念,以免在编码时混淆概念

    LineChart   // 折线表,存线集合,与xml中的控件绑定实力化
    LineData    // 线集合,所有折线以数组的形式存到此集合中
    LineDataSet // 点集合,即一条折线
    Entry       // 某条折线上的一个点
    
    XAxis       // X轴
    YAxis       // Y轴,Y轴分左右,通过lineChart的getAxisLeft()、getAxisRight()得到
    Legend      // 图例,即标识哪一条曲线,如用红色标识电流折线,蓝色标识电压折线
    LimitLine   // 限制线
    Description // 描述
    List<Float> list = new ArrayList<>();    // 存放数据的list列表
    List<Entry> entrys = new ArrayList<>();  // 存放折线需要的点的列表
    LineDataSet mStepTimeDataSet = new LineDataSet(entrys, "步时间"); // LineDataSet:点集合,即一条线
            

    图解

    1.XAxis(X轴)

    设置x轴需要注意一下几个点:

    • 设置x轴的坐标之间的最小间隔,如xAxis.setGranularity(1f),即间隔为1、
    • 设置x轴的最大/小值,xAxis.setAxisMinimum(0f),xAxis.setAxisMaximum(20f),则x轴的范围是0-20
    • 设置x轴的刻度数量,xAxis.setLabelCount(10, true),即x轴有10个刻度线,此时一个刻度表示2,如果是将10改为40,由于之前设置了坐标之间的间隔,所以x轴一个刻度会表示1,而不是0.5.
    • 设置当前页面显示几个刻度,mLineChart.setVisibleXRangeMaximum(6),// 设置当前图表中最多在x轴坐标线上显示的刻度线总量为6
    1.得到X轴:
    XAxis xAxis = mLineChart.getXAxis(); 
    
    2.设置X轴的位置(默认在上方):
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//值:BOTTOM,BOTH_SIDED,BOTTOM_INSIDE,TOP,TOP_INSIDE
    
    3.设置X轴坐标之间的最小间隔(因为此图有缩放功能,X轴,Y轴可设置可缩放)
    xAxis.setGranularity(1f);
    
    4.设置X轴的刻度数量
    xAxis.setLabelCount(12, true);
    
    5.设置X轴的值(最小值、最大值、然后会根据设置的刻度数量自动分配刻度显示)
    xAxis.setAxisMinimum(0f);
    xAxis.setAxisMaximum(20f);
    
    6.设置当前图表中最多在x轴坐标线上显示刻度线的总量
    mLineChart.setVisibleXRangeMaximum(6);// 设置当前图表中最多在x轴坐标线上显示的刻度线总量为6
    
    
    7.设置X轴值为字符串(如上右图)
    xAxis.setValueFormatter(new IAxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            return mList.get((int) value); //mList为存有月份的String集合
        }
    });
    
    想要显示完整的12个月份,要与(x,y)坐标对应数量应该为12
    
    for (int i = 0; i < 12; i++) {
        entries.add(new Entry(i, (float) (Math.random()) * 80)); //Entry(float x, float y)
    }
    
    还有设置线条颜色、字体颜色、等等,可查看详细的文档。
    
    8.取消曲线显示的值为整数
    与设置自定义X轴类似,设置曲线显示值为整数,可在设置曲线LineDataSet 时,修改值的类型
    lineDataSet.setValueFormatter(new IValueFormatter() {
        @Override
        public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
            int IValue = (int) value;
            return String.valueOf(IValue);
        }
    });

    2.YAxis(Y轴)

    Y轴和X轴类似,不过Y轴分左右,这里只介绍几个不同的地方

    1.得到Y轴
    YAxis leftYAxis = mLineChart.getAxisLeft();
    YAxis rightYAxis = mLineChart.getAxisRight();
    
    2.设置某一个Y轴是否显示
    rightYAxis.setEnabled(false); //右侧Y轴不显示
    
    3.限制线LimitLine(如上右图)
    LimitLine limitLine = new LimitLine(95,"高限制性"); //得到限制线
    limitLine.setLineWidth(4f); //宽度
    limitLine.setTextSize(10f);
    limitLine.setTextColor(Color.RED);  //颜色
    limitLine.setLineColor(Color.BLUE);
    rightYAxis.addLimitLine(limitLine); //Y轴添加限制线
    
    4.X轴和Y轴类似,都具有相同的属性方法
    
    rightYAxis.setAxisMinimum(0f);
    rightYAxis.setAxisMaximum(100f);
    
    rightYAxis.setGranularity(1f);
    rightYAxis.setLabelCount(11,false);
    rightYAxis.setTextColor(Color.BLUE); //文字颜色
    rightYAxis.setGridColor(Color.RED); //网格线颜色
    rightYAxis.setAxisLineColor(Color.GREEN); //Y轴颜色
    
    以及格式化Y轴的值
    
    leftYAxis.setValueFormatter(new IAxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            return (int) value + "%";
        }
    });
    

    3.Legend(图例:即上图所示的曲线图下面的 温度)

    1.得到Lengend
    
    Legend legend = mLineChart.getLegend();
    
    2.设置Lengend位置
    
    legend.setTextColor(Color.CYAN); //设置Legend 文本颜色
    legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
    legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
    legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
    
    3.设置标签是否换行(当多条标签时 需要换行显示、如上右图)
    true:可换行。false:不换行
    
    legend.setWordWrapEnabled(true);
    
    4.隐藏Lengend
    
    legend.setEnabled(false);
    

    4.Description(描述)

    1.隐藏描述
    
    Description description = new Description();
    description.setEnabled(false);
    mLineChart.setDescription(description);
    
    2.设置描述内容
    
    Description description = new Description();
    description.setText("X轴描述");
    description.setTextColor(Color.RED);
    mLineChart.setDescription(description);

    5.MarkerView

    MarkerView可自定义,用于点击图标值时显示想要的内容

    1.自定义MarkerView
    
    public class MyMarkerView extends MarkerView {
    
        private TextView tvContent;
        private DecimalFormat format = new DecimalFormat("##0");
    
        public MyMarkerView(Context context) {
            super(context, R.layout.layout_markerview);
            tvContent = (TextView) findViewById(R.id.tvContent);
        }
    
        @Override
        public void refreshContent(Entry e, Highlight highlight) {
            tvContent.setText(format.format(e.getY()));
            super.refreshContent(e, highlight);
        }
    
        @Override
        public MPPointF getOffset() {
            return new MPPointF(-(getWidth() / 2), -getHeight() - 10);
        }
    }
    
    2.设置显示MarkerView
    
    MyMarkerView mv = new MyMarkerView(this);
    mLineChart.setMarkerView(mv);

    6.折线图的线条设置

    LineDataSet lineDataSet = new LineDataSet(entries, "温度");//一个LineDataSet就是一条线
    lineDataSet.setDrawCircleHole(false);//设置曲线值的圆点是实心还是空心
    lineDataSet.setValueTextSize(9f);//设置显示值的字体大小
    lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);//线模式为圆滑曲线(默认折线)

    三、LineChart实现动态添加曲线,以及多曲线动态添加数据

    接下来我们实现一个LineChart图表,它包含动态添加曲线,以及多曲线动态添加数据,

    下面是代码逻辑:

    • 默认添加三条折线,但是这三条曲线中暂时不添加点,后面我们动态添加
    • 有个Handler用于发从动态添加点的消息,延时一秒发一次
    • 有两个Button,一个控制开始添加点,一个控制暂停添加点
    • 还有三个CheckBox,对应三条折线,那个选中便显示哪条曲线

    效果图:

     

    1. 在xml中添加基本控件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".module.details.LineChartDemo">
    
        <com.github.mikephil.charting.charts.LineChart
            android:id="@+id/demo_linechart"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp200" />
    
        <CheckBox
            android:id="@+id/demo_checkbox1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="折线1" />
    
        <CheckBox
            android:id="@+id/demo_checkbox2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="折线2" />
    
        <CheckBox
            android:id="@+id/demo_checkbox3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="折线3" />
    
        <Button
            android:id="@+id/demo_start"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="开始"/>
    
        <Button
            android:id="@+id/demo_pause"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="暂停"/>
    
    </LinearLayout>

    2.初始化基本属性,控件

    首先声明了Handler所需要的消息,折线编号,基本控件,以及LineChart所需要的对象。

    之后 封装了Activity的启动方式,以及随机产生Y值的方法。

    然后在onCreate方法中对控件初始化

    public class LineChartDemo extends AppCompatActivity implements View.OnClickListener {
    
    
        public static final int MSG_START = 1; // handler消息,开始添加点
    
        // 折线编号
        public static final int LINE_NUMBER_1 = 0;
        public static final int LINE_NUMBER_2 = 1;
        public static final int LINE_NUMBER_3 = 2;
    
        /**
         * 功能:启动方式
         */
        public static void startActivity(Context context) {
            context.startActivity(new Intent(context, LineChartDemo.class));
        }
    
        private DemoHandler mDemoHandler; // 自定义Handler
        private Random mRandom = new Random(); // 随机产生点
        private DecimalFormat mDecimalFormat = new DecimalFormat("#.00");   // 格式化浮点数位两位小数
    
    
        Button mBtnStart;   // 开始添加点
        Button mBtnPause;   // 暂停添加点
        CheckBox mCheckBox1;
        CheckBox mCheckBox2;
        CheckBox mCheckBox3;
        List<CheckBox> mCheckBoxList = new ArrayList<>();
    
        LineChart mLineChart; // 折线表,存线集合
        LineData mLineData; // 线集合,所有折现以数组的形式存到此集合中
        XAxis mXAxis; //X轴
        YAxis mLeftYAxis; //左侧Y轴
        YAxis mRightYAxis; //右侧Y轴
        Legend mLegend; //图例
        LimitLine mLimitline; //限制线
    
        //  Y值数据链表
        List<Float> mList1 = new ArrayList<>();
        List<Float> mList2 = new ArrayList<>();
        List<Float> mList3 = new ArrayList<>();
    
        // Chart需要的点数据链表
        List<Entry> mEntries1 = new ArrayList<>();
        List<Entry> mEntries2 = new ArrayList<>();
        List<Entry> mEntries3 = new ArrayList<>();
    
        // LineDataSet:点集合,即一条线
        LineDataSet mLineDataSet1 = new LineDataSet(mEntries1, "折线1");
        LineDataSet mLineDataSet2 = new LineDataSet(mEntries2, "折线2");
        LineDataSet mLineDataSet3 = new LineDataSet(mEntries3, "折线3");
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.demo_activity_line_chart);
    
            mDemoHandler = new DemoHandler(this);
            initView();
            
        }
    
    
        /**
         * 功能:产生随机数(小数点两位)
         */
        public Float getRandom(Float seed) {
            return Float.valueOf(mDecimalFormat.format(mRandom.nextFloat() * seed));
        }
    
        /**
         * 功能:初始化基本控件,button,checkbox
         */
        public void initView() {
            mBtnStart = findViewById(R.id.demo_start);
            mBtnPause = findViewById(R.id.demo_pause);
            mCheckBox1 = findViewById(R.id.demo_checkbox1);
            mCheckBox2 = findViewById(R.id.demo_checkbox2);
            mCheckBox3 = findViewById(R.id.demo_checkbox3);
            mCheckBoxList.add(mCheckBox1);
            mCheckBoxList.add(mCheckBox2);
            mCheckBoxList.add(mCheckBox3);
    
            mBtnStart.setOnClickListener(this);
            mBtnPause.setOnClickListener(this);
            mCheckBox1.setOnClickListener(this);
            mCheckBox2.setOnClickListener(this);
            mCheckBox3.setOnClickListener(this);
    
        }
    
    }

    3. 初始化折线:initLineChart()

    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.demo_activity_line_chart);
    
            mDemoHandler = new DemoHandler(this);
            initView(); // 初始化控件
            initLineChart(); // 初始化折线图
        }

    initLineChart()方法:

        /**
         * 功能:初始化LineChart
         */
        public void initLineChart() {
            mLineChart = findViewById(R.id.demo_linechart);
            mXAxis = mLineChart.getXAxis(); // 得到x轴
            mLeftYAxis = mLineChart.getAxisLeft(); // 得到侧Y轴
            mRightYAxis = mLineChart.getAxisRight(); // 得到右侧Y轴
            mLegend = mLineChart.getLegend(); // 得到图例
            mLineData = new LineData();
            mLineChart.setData(mLineData);
    
            // 设置图标基本属性
            setChartBasicAttr(mLineChart);
    
            // 设置XY轴
            setXYAxis(mLineChart, mXAxis, mLeftYAxis, mRightYAxis);
    
            // 添加线条
            initLine();
    
            // 设置图例
            createLegend(mLegend);
    
            // 设置MarkerView
            setMarkerView(mLineChart);
        }
    
    

    4. 设置图标基本属性:setChartBasicAttr()

    
        /**
         * 功能:设置图标的基本属性
         */
        void setChartBasicAttr(LineChart lineChart) {
            /***图表设置***/
            lineChart.setDrawGridBackground(false); //是否展示网格线
            lineChart.setDrawBorders(true); //是否显示边界
            lineChart.setDragEnabled(true); //是否可以拖动
            lineChart.setScaleEnabled(true); // 是否可以缩放
            lineChart.setTouchEnabled(true); //是否有触摸事件
            //设置XY轴动画效果
            //lineChart.animateY(2500);
            lineChart.animateX(1500);
        }


    5. 设置XY轴:setXYAxis()

        /**
         * 功能:设置XY轴
         */
        void setXYAxis(LineChart lineChart, XAxis xAxis, YAxis leftYAxis, YAxis rightYAxis) {
            /***XY轴的设置***/
            xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); //X轴设置显示位置在底部
            xAxis.setAxisMinimum(0f); // 设置X轴的最小值
            xAxis.setAxisMaximum(20); // 设置X轴的最大值
            xAxis.setLabelCount(20, false); // 设置X轴的刻度数量,第二个参数表示是否平均分配
            xAxis.setGranularity(1f); // 设置X轴坐标之间的最小间隔
            lineChart.setVisibleXRangeMaximum(5);// 当前统计图表中最多在x轴坐标线上显示的总量
            //保证Y轴从0开始,不然会上移一点
            leftYAxis.setAxisMinimum(0f);
            rightYAxis.setAxisMinimum(0f);
            leftYAxis.setAxisMaximum(100f);
            rightYAxis.setAxisMaximum(100f);
            leftYAxis.setGranularity(1f);
            rightYAxis.setGranularity(1f);
            leftYAxis.setLabelCount(20);
            lineChart.setVisibleYRangeMaximum(30, YAxis.AxisDependency.LEFT);// 当前统计图表中最多在Y轴坐标线上显示的总量
            lineChart.setVisibleYRangeMaximum(30, YAxis.AxisDependency.RIGHT);// 当前统计图表中最多在Y轴坐标线上显示的总量
            leftYAxis.setEnabled(false);
    
    //        leftYAxis.setCenterAxisLabels(true);// 将轴标记居中
    //        leftYAxis.setDrawZeroLine(true); // 原点处绘制 一条线
    //        leftYAxis.setZeroLineColor(Color.RED);
    //        leftYAxis.setZeroLineWidth(1f);
        }
    

    6.初始化LineDataSet(一条曲线):initLineDataSet()

    此方法被在创建一个线条时调用,为曲线初始化做好准备

        /**
         * 曲线初始化设置,一个LineDataSet 代表一条曲线
         *
         * @param lineDataSet 线条
         * @param color       线条颜色
         * @param mode
         */
        private void initLineDataSet(LineDataSet lineDataSet, int color, LineDataSet.Mode mode) {
            lineDataSet.setColor(color); // 设置曲线颜色
            lineDataSet.setCircleColor(color);  // 设置数据点圆形的颜色
            lineDataSet.setDrawCircleHole(false);// 设置曲线值的圆点是否是空心
            lineDataSet.setLineWidth(1f); // 设置折线宽度
            lineDataSet.setCircleRadius(3f); // 设置折现点圆点半径
            lineDataSet.setValueTextSize(10f);
    
            lineDataSet.setDrawFilled(true); //设置折线图填充
            lineDataSet.setFormLineWidth(1f);
            lineDataSet.setFormSize(15.f);
            if (mode == null) {
                //设置曲线展示为圆滑曲线(如果不设置则默认折线)
                lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
            } else {
                lineDataSet.setMode(mode);
            }
    
        }
    

    7.动态创建并添加一个线条:createLine()

    根据传进来的dataList,生成点Entry,之后根据生成的点更新折线图即可

        /**
         * 功能:动态创建一条曲线
         */
        private void createLine(List<Float> dataList, List<Entry> entries, LineDataSet lineDataSet, int color, LineData lineData, LineChart lineChart) {
            for (int i = 0; i < dataList.size(); i++) {
                /**
                 * 在此可查看 Entry构造方法,可发现 可传入数值 Entry(float x, float y)
                 * 也可传入Drawable, Entry(float x, float y, Drawable icon) 可在XY轴交点 设置Drawable图像展示
                 */
                Entry entry = new Entry(i, dataList.get(i));// Entry(x,y)
                entries.add(entry);
            }
    
            // 初始化线条
            initLineDataSet(lineDataSet, color, LineDataSet.Mode.CUBIC_BEZIER);
            
            if (lineData == null) {
                lineData = new LineData();
                lineData.addDataSet(lineDataSet);
                lineChart.setData(lineData);
            } else {
                lineChart.getLineData().addDataSet(lineDataSet);
            }
            
            lineChart.invalidate();
        }

    8. 初始化项目中的三条折线:initLine()

    首先创建三条折线,之后设置三条折线隐藏,最后根据配置默认显示第一条折线

        /**
         * 功能:对图表中的曲线初始化,添加三条,并且默认显示第一条
         */
        void initLine() {
    
            createLine(mList1, mEntries1, mLineDataSet1, LColor.Colors.RED.getColor(), mLineData, mLineChart);
            createLine(mList2, mEntries2, mLineDataSet2, LColor.Colors.ORANGE.getColor(), mLineData, mLineChart);
            createLine(mList3, mEntries3, mLineDataSet3, LColor.Colors.YELLOW.getColor(), mLineData, mLineChart);
    
    
            // mLineData.getDataSetCount() 总线条数
            // mLineData.getEntryCount() 总点数
            // mLineData.getDataSetByIndex(index).getEntryCount() 索引index处折线的总点数
            // 每条曲线添加到mLineData后,从索引0处开始排列
            for (int i = 0; i < mLineData.getDataSetCount(); i++) {
                mLineChart.getLineData().getDataSets().get(i).setVisible(false); //
            }
            showLine(LINE_NUMBER_1);
        }
    
    

    9. 设置图例:createLegend()

        /**
         * 功能:创建图例
         */
        private void createLegend(Legend legend) {
            /***折线图例 标签 设置***/
            //设置显示类型,LINE CIRCLE SQUARE EMPTY 等等 多种方式,查看LegendForm 即可
            legend.setForm(Legend.LegendForm.CIRCLE);
            legend.setTextSize(12f);
            //显示位置 左下方
            legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
            legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
            legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
            //是否绘制在图表里面
            legend.setDrawInside(false);
            legend.setEnabled(true);
        }
    

    10. 设置MarkerView: setMarkerView()

        /**
         * 设置 可以显示X Y 轴自定义值的 MarkerView
         */
        public void setMarkerView(LineChart lineChart) {
            LineChartMarkViewDemo mv = new LineChartMarkViewDemo(this);
            mv.setChartView(lineChart);
            lineChart.setMarker(mv);
            lineChart.invalidate();
        }
    

    LineChartMarkViewDemo是自定义的,这个很简单,一般是自定义XML,之后继承MarkView即可。

    xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        xmlns:tools="http://schemas.android.com/tools"
        android:background="@drawable/shape_square"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/xValues_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@android:color/white"
            tools:text="123" />
    
        <TextView
            android:id="@+id/yValue_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:textColor="@android:color/white"
            tools:text="222123" />
    
    </LinearLayout>
    

    java

    public class LineChartMarkViewDemo extends MarkerView {
    
        DecimalFormat df = new DecimalFormat(".00");
        private TextView mXValueTv;
        private TextView mYValueTv;
    
        public LineChartMarkViewDemo(Context context) {
            super(context, R.layout.layout_markview);
    
            mXValueTv = findViewById(R.id.xValues_tv);
            mYValueTv = findViewById(R.id.yValue_tv);
        }
    
        @SuppressLint("SetTextI18n")
        @Override
        public void refreshContent(Entry e, Highlight highlight) {
            //展示自定义X轴值 后的X轴内容
            mXValueTv.setText("X = " + df.format(e.getX()));
            mYValueTv.setText("Y = " + df.format(e.getY()));
            super.refreshContent(e, highlight);
        }
    
        @Override
        public MPPointF getOffset() {
            return new MPPointF(-(getWidth() / 2), -getHeight());
        }
    }
    

    11.动态添加数据点:addEntry()

        /**
         * 动态添加数据
         * 在一个LineChart中存放的折线,其实是以索引从0开始编号的
         *
         * @param yValues y值
         */
        public void addEntry(LineData lineData, LineChart lineChart, float yValues, int index) {
    
            // 通过索引得到一条折线,之后得到折线上当前点的数量
            int xCount = lineData.getDataSetByIndex(index).getEntryCount(); 
    
    
            Entry entry = new Entry(xCount, yValues); // 创建一个点
            lineData.addEntry(entry, index); // 将entry添加到指定索引处的折线中
    
            //通知数据已经改变
            lineData.notifyDataChanged();
            lineChart.notifyDataSetChanged();
    
            //把yValues移到指定索引的位置
            lineChart.moveViewToAnimated(xCount - 4, yValues, YAxis.AxisDependency.LEFT, 1000);// TODO: 2019/5/4 内存泄漏,异步 待修复
            lineChart.invalidate();
        }
    
    
    
        /**
         * 功能:第1条折线添加一个点
         */
        public void addLine1Data(float yValues) {
            addEntry(mLineData, mLineChart, yValues, LINE_NUMBER_1);
        }
    
        /**
         * 功能:第2条折线添加一个点
         */
        public void addLine2Data(float yValues) {
            addEntry(mLineData, mLineChart, yValues, LINE_NUMBER_2);
        }
    
        /**
         * 功能:第3条折线添加一个点
         */
        public void addLine3Data(float yValues) {
            addEntry(mLineData, mLineChart, yValues, LINE_NUMBER_3);
        }

    12.自定义Handler:DemoHandler

    自定义一个Handler,通过静态内部类+弱引用的方式可以很好的防止内存泄漏

    封装发送和暂停方法:

        /**
         * 功能:发送开始
         */
        void sendStartAddEntry() {
            if (!mDemoHandler.hasMessages(MSG_START)) { // 判断是否有消息队列此消息,如果没有则发送
                mDemoHandler.sendEmptyMessageDelayed(MSG_START, 1000);
            }
        }
    
        /**
         * 功能:暂停添加点,即移除所有消息
         */
        void sendPauseAddEntry() {
            mDemoHandler.removeCallbacksAndMessages(null);
        }

    自定义Handler

    
        /**
         * 功能:自定义Handler,通过弱引用的方式防止内存泄漏
         */
        private static class DemoHandler extends Handler {
    
            WeakReference<LineChartDemo> mReference;
    
            DemoHandler(LineChartDemo activity) {
                mReference = new WeakReference<>(activity);
            }
    
    
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                LineChartDemo lineChartDemo = mReference.get();
                if (lineChartDemo == null) {
                    return;
                }
                switch (msg.what) {
                    case MSG_START:
                        lineChartDemo.addLine1Data(lineChartDemo.getRandom(30f));
                        lineChartDemo.addLine2Data(lineChartDemo.getRandom(20f));
                        lineChartDemo.addLine3Data(lineChartDemo.getRandom(10f));
                        lineChartDemo.sendStartAddEntry();
                        break;
                    default:
                }
            }
        }

    13. 点击事件:onClick()

    
    
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.demo_start:
                    sendStartAddEntry();
                    break;
                case R.id.demo_pause:
                    sendPauseAddEntry();
                    break;
                case R.id.demo_checkbox1:
                    showLine(LINE_NUMBER_1);
                    break;
                case R.id.demo_checkbox2:
                    showLine(LINE_NUMBER_2);
                    break;
                case R.id.demo_checkbox3:
                    showLine(LINE_NUMBER_3);
                    break;
                default:
            }
        }
    

    14.最后一步,回收:onDestory

        @Override
        protected void onDestroy() {
            super.onDestroy();
            // 清空消息
            mDemoHandler.removeCallbacksAndMessages(null);
            mDemoHandler = null;
    
            // moveViewToAnimated 移动到某个点,有内存泄漏,暂未修复,希望网友可以指着
            mLineChart.clearAllViewportJobs();
            mLineChart.removeAllViewsInLayout();
            mLineChart.removeAllViews();
        }

    四、全部Java代码

    XML,以及自定义MarkView已经在上面给出了,现在补上全部的java代码

    package com.liang.batterytestsystem.module.details;
    
    import android.content.Context;
    import android.content.Intent;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.CheckBox;
    
    import com.github.mikephil.charting.charts.LineChart;
    import com.github.mikephil.charting.components.Legend;
    import com.github.mikephil.charting.components.LimitLine;
    import com.github.mikephil.charting.components.XAxis;
    import com.github.mikephil.charting.components.YAxis;
    import com.github.mikephil.charting.data.Entry;
    import com.github.mikephil.charting.data.LineData;
    import com.github.mikephil.charting.data.LineDataSet;
    import com.liang.batterytestsystem.R;
    import com.liang.batterytestsystem.utils.LColor;
    import com.liang.liangutils.utils.LLogX;
    import com.liang.liangutils.view.LTitleView;
    
    import java.lang.ref.WeakReference;
    import java.text.DecimalFormat;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    public class LineChartDemo extends AppCompatActivity implements View.OnClickListener {
    
    
        public static final int MSG_START = 1; // handler消息,开始添加点
    
        // 折线编号
        public static final int LINE_NUMBER_1 = 0;
        public static final int LINE_NUMBER_2 = 1;
        public static final int LINE_NUMBER_3 = 2;
    
        /**
         * 功能:启动方式
         */
        public static void startActivity(Context context) {
            context.startActivity(new Intent(context, LineChartDemo.class));
        }
    
        private DemoHandler mDemoHandler; // 自定义Handler
        private Random mRandom = new Random(); // 随机产生点
        private DecimalFormat mDecimalFormat = new DecimalFormat("#.00");   // 格式化浮点数位两位小数
    
    
        Button mBtnStart;   // 开始添加点
        Button mBtnPause;   // 暂停添加点
        CheckBox mCheckBox1;
        CheckBox mCheckBox2;
        CheckBox mCheckBox3;
        List<CheckBox> mCheckBoxList = new ArrayList<>();
    
        LineChart mLineChart; // 折线表,存线集合
        LineData mLineData; // 线集合,所有折现以数组的形式存到此集合中
        XAxis mXAxis; //X轴
        YAxis mLeftYAxis; //左侧Y轴
        YAxis mRightYAxis; //右侧Y轴
        Legend mLegend; //图例
        LimitLine mLimitline; //限制线
    
        //  Y值数据链表
        List<Float> mList1 = new ArrayList<>();
        List<Float> mList2 = new ArrayList<>();
        List<Float> mList3 = new ArrayList<>();
    
        // Chart需要的点数据链表
        List<Entry> mEntries1 = new ArrayList<>();
        List<Entry> mEntries2 = new ArrayList<>();
        List<Entry> mEntries3 = new ArrayList<>();
    
        // LineDataSet:点集合,即一条线
        LineDataSet mLineDataSet1 = new LineDataSet(mEntries1, "折线1");
        LineDataSet mLineDataSet2 = new LineDataSet(mEntries2, "折线2");
        LineDataSet mLineDataSet3 = new LineDataSet(mEntries3, "折线3");
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.demo_activity_line_chart);
    
            mDemoHandler = new DemoHandler(this);
            initView();
            initLineChart();
        }
    
    
        /**
         * 功能:产生随机数(小数点两位)
         */
        public Float getRandom(Float seed) {
            return Float.valueOf(mDecimalFormat.format(mRandom.nextFloat() * seed));
        }
    
        /**
         * 功能:初始化基本控件,button,checkbox
         */
        public void initView() {
            mBtnStart = findViewById(R.id.demo_start);
            mBtnPause = findViewById(R.id.demo_pause);
            mCheckBox1 = findViewById(R.id.demo_checkbox1);
            mCheckBox2 = findViewById(R.id.demo_checkbox2);
            mCheckBox3 = findViewById(R.id.demo_checkbox3);
            mCheckBoxList.add(mCheckBox1);
            mCheckBoxList.add(mCheckBox2);
            mCheckBoxList.add(mCheckBox3);
    
            mBtnStart.setOnClickListener(this);
            mBtnPause.setOnClickListener(this);
            mCheckBox1.setOnClickListener(this);
            mCheckBox2.setOnClickListener(this);
            mCheckBox3.setOnClickListener(this);
    
        }
    
        /**
         * 功能:初始化LineChart
         */
        public void initLineChart() {
            mLineChart = findViewById(R.id.demo_linechart);
            mXAxis = mLineChart.getXAxis(); // 得到x轴
            mLeftYAxis = mLineChart.getAxisLeft(); // 得到侧Y轴
            mRightYAxis = mLineChart.getAxisRight(); // 得到右侧Y轴
            mLegend = mLineChart.getLegend(); // 得到图例
            mLineData = new LineData();
            mLineChart.setData(mLineData);
    
            // 设置图标基本属性
            setChartBasicAttr(mLineChart);
    
            // 设置XY轴
            setXYAxis(mLineChart, mXAxis, mLeftYAxis, mRightYAxis);
    
            // 添加线条
            initLine();
    
            // 设置图例
            createLegend(mLegend);
    
            // 设置MarkerView
            setMarkerView(mLineChart);
        }
    
    
        /**
         * 功能:设置图标的基本属性
         */
        void setChartBasicAttr(LineChart lineChart) {
            /***图表设置***/
            lineChart.setDrawGridBackground(false); //是否展示网格线
            lineChart.setDrawBorders(true); //是否显示边界
            lineChart.setDragEnabled(true); //是否可以拖动
            lineChart.setScaleEnabled(true); // 是否可以缩放
            lineChart.setTouchEnabled(true); //是否有触摸事件
            //设置XY轴动画效果
            //lineChart.animateY(2500);
            lineChart.animateX(1500);
        }
    
        /**
         * 功能:设置XY轴
         */
        void setXYAxis(LineChart lineChart, XAxis xAxis, YAxis leftYAxis, YAxis rightYAxis) {
            /***XY轴的设置***/
            xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); //X轴设置显示位置在底部
            xAxis.setAxisMinimum(0f); // 设置X轴的最小值
            xAxis.setAxisMaximum(20); // 设置X轴的最大值
            xAxis.setLabelCount(20, false); // 设置X轴的刻度数量,第二个参数表示是否平均分配
            xAxis.setGranularity(1f); // 设置X轴坐标之间的最小间隔
            lineChart.setVisibleXRangeMaximum(5);// 当前统计图表中最多在x轴坐标线上显示的总量
            //保证Y轴从0开始,不然会上移一点
            leftYAxis.setAxisMinimum(0f);
            rightYAxis.setAxisMinimum(0f);
            leftYAxis.setAxisMaximum(100f);
            rightYAxis.setAxisMaximum(100f);
            leftYAxis.setGranularity(1f);
            rightYAxis.setGranularity(1f);
            leftYAxis.setLabelCount(20);
            lineChart.setVisibleYRangeMaximum(30, YAxis.AxisDependency.LEFT);// 当前统计图表中最多在Y轴坐标线上显示的总量
            lineChart.setVisibleYRangeMaximum(30, YAxis.AxisDependency.RIGHT);// 当前统计图表中最多在Y轴坐标线上显示的总量
            leftYAxis.setEnabled(false);
    
    //        leftYAxis.setCenterAxisLabels(true);// 将轴标记居中
    //        leftYAxis.setDrawZeroLine(true); // 原点处绘制 一条线
    //        leftYAxis.setZeroLineColor(Color.RED);
    //        leftYAxis.setZeroLineWidth(1f);
        }
    
        /**
         * 功能:对图表中的曲线初始化,添加三条,并且默认显示第一条
         */
        void initLine() {
    
            createLine(mList1, mEntries1, mLineDataSet1, LColor.Colors.RED.getColor(), mLineData, mLineChart);
            createLine(mList2, mEntries2, mLineDataSet2, LColor.Colors.ORANGE.getColor(), mLineData, mLineChart);
            createLine(mList3, mEntries3, mLineDataSet3, LColor.Colors.YELLOW.getColor(), mLineData, mLineChart);
    
    
            // mLineData.getDataSetCount() 总线条数
            // mLineData.getEntryCount() 总点数
            // mLineData.getDataSetByIndex(index).getEntryCount() 索引index处折线的总点数
            // 每条曲线添加到mLineData后,从索引0处开始排列
            for (int i = 0; i < mLineData.getDataSetCount(); i++) {
                mLineChart.getLineData().getDataSets().get(i).setVisible(false); //
            }
            showLine(LINE_NUMBER_1);
        }
    
        /**
         * 功能:根据索引显示或隐藏指定线条
         */
        public void showLine(int index) {
            mLineChart
                    .getLineData()
                    .getDataSets()
                    .get(index)
                    .setVisible(mCheckBoxList.get(index).isChecked());
            mLineChart.invalidate();
        }
    
        /**
         * 功能:动态创建一条曲线
         */
        private void createLine(List<Float> dataList, List<Entry> entries, LineDataSet lineDataSet, int color, LineData lineData, LineChart lineChart) {
            for (int i = 0; i < dataList.size(); i++) {
                /**
                 * 在此可查看 Entry构造方法,可发现 可传入数值 Entry(float x, float y)
                 * 也可传入Drawable, Entry(float x, float y, Drawable icon) 可在XY轴交点 设置Drawable图像展示
                 */
                Entry entry = new Entry(i, dataList.get(i));// Entry(x,y)
                entries.add(entry);
            }
    
            // 初始化线条
            initLineDataSet(lineDataSet, color, LineDataSet.Mode.CUBIC_BEZIER);
    
            if (lineData == null) {
                lineData = new LineData();
                lineData.addDataSet(lineDataSet);
                lineChart.setData(lineData);
            } else {
                lineChart.getLineData().addDataSet(lineDataSet);
            }
    
            lineChart.invalidate();
        }
    
    
        /**
         * 曲线初始化设置,一个LineDataSet 代表一条曲线
         *
         * @param lineDataSet 线条
         * @param color       线条颜色
         * @param mode
         */
        private void initLineDataSet(LineDataSet lineDataSet, int color, LineDataSet.Mode mode) {
            lineDataSet.setColor(color); // 设置曲线颜色
            lineDataSet.setCircleColor(color);  // 设置数据点圆形的颜色
            lineDataSet.setDrawCircleHole(false);// 设置曲线值的圆点是否是空心
            lineDataSet.setLineWidth(1f); // 设置折线宽度
            lineDataSet.setCircleRadius(3f); // 设置折现点圆点半径
            lineDataSet.setValueTextSize(10f);
    
            lineDataSet.setDrawFilled(true); //设置折线图填充
            lineDataSet.setFormLineWidth(1f);
            lineDataSet.setFormSize(15.f);
            if (mode == null) {
                //设置曲线展示为圆滑曲线(如果不设置则默认折线)
                lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
            } else {
                lineDataSet.setMode(mode);
            }
    
        }
    
    
        /**
         * 功能:创建图例
         */
        private void createLegend(Legend legend) {
            /***折线图例 标签 设置***/
            //设置显示类型,LINE CIRCLE SQUARE EMPTY 等等 多种方式,查看LegendForm 即可
            legend.setForm(Legend.LegendForm.CIRCLE);
            legend.setTextSize(12f);
            //显示位置 左下方
            legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
            legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
            legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
            //是否绘制在图表里面
            legend.setDrawInside(false);
            legend.setEnabled(true);
        }
    
    
        /**
         * 设置 可以显示X Y 轴自定义值的 MarkerView
         */
        public void setMarkerView(LineChart lineChart) {
            LineChartMarkViewDemo mv = new LineChartMarkViewDemo(this);
            mv.setChartView(lineChart);
            lineChart.setMarker(mv);
            lineChart.invalidate();
        }
    
    
        /**
         * 动态添加数据
         * 在一个LineChart中存放的折线,其实是以索引从0开始编号的
         *
         * @param yValues y值
         */
        public void addEntry(LineData lineData, LineChart lineChart, float yValues, int index) {
    
            // 通过索引得到一条折线,之后得到折线上当前点的数量
            int xCount = lineData.getDataSetByIndex(index).getEntryCount();
    
    
            Entry entry = new Entry(xCount, yValues); // 创建一个点
            lineData.addEntry(entry, index); // 将entry添加到指定索引处的折线中
    
            //通知数据已经改变
            lineData.notifyDataChanged();
            lineChart.notifyDataSetChanged();
    
            //把yValues移到指定索引的位置
            lineChart.moveViewToAnimated(xCount - 4, yValues, YAxis.AxisDependency.LEFT, 1000);// TODO: 2019/5/4 内存泄漏,异步 待修复
            lineChart.invalidate();
        }
    
    
        /**
         * 功能:第1条折线添加一个点
         */
        public void addLine1Data(float yValues) {
            addEntry(mLineData, mLineChart, yValues, LINE_NUMBER_1);
        }
    
        /**
         * 功能:第2条折线添加一个点
         */
        public void addLine2Data(float yValues) {
            addEntry(mLineData, mLineChart, yValues, LINE_NUMBER_2);
        }
    
        /**
         * 功能:第3条折线添加一个点
         */
        public void addLine3Data(float yValues) {
            addEntry(mLineData, mLineChart, yValues, LINE_NUMBER_3);
        }
    
        /**
         * 功能:发送开始
         */
        void sendStartAddEntry() {
            if (!mDemoHandler.hasMessages(MSG_START)) { // 判断是否有消息队列此消息,如果没有则发送
                mDemoHandler.sendEmptyMessageDelayed(MSG_START, 1000);
            }
        }
    
        /**
         * 功能:暂停添加点,即移除所有消息
         */
        void sendPauseAddEntry() {
            mDemoHandler.removeCallbacksAndMessages(null);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            // 清空消息
            mDemoHandler.removeCallbacksAndMessages(null);
            mDemoHandler = null;
    
            // moveViewToAnimated 移动到某个点,有内存泄漏,暂未修复,希望网友可以指着
            mLineChart.clearAllViewportJobs();
            mLineChart.removeAllViewsInLayout();
            mLineChart.removeAllViews();
        }
    
    
    
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.demo_start:
                    sendStartAddEntry();
                    break;
                case R.id.demo_pause:
                    sendPauseAddEntry();
                    break;
                case R.id.demo_checkbox1:
                    showLine(LINE_NUMBER_1);
                    break;
                case R.id.demo_checkbox2:
                    showLine(LINE_NUMBER_2);
                    break;
                case R.id.demo_checkbox3:
                    showLine(LINE_NUMBER_3);
                    break;
                default:
            }
        }
    
    
    
        /**
         * 功能:自定义Handler,通过弱引用的方式防止内存泄漏
         */
        private static class DemoHandler extends Handler {
    
            WeakReference<LineChartDemo> mReference;
    
            DemoHandler(LineChartDemo activity) {
                mReference = new WeakReference<>(activity);
            }
    
    
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                LineChartDemo lineChartDemo = mReference.get();
                if (lineChartDemo == null) {
                    return;
                }
                switch (msg.what) {
                    case MSG_START:
                        lineChartDemo.addLine1Data(lineChartDemo.getRandom(30f));
                        lineChartDemo.addLine2Data(lineChartDemo.getRandom(20f));
                        lineChartDemo.addLine3Data(lineChartDemo.getRandom(10f));
                        lineChartDemo.sendStartAddEntry();
                        break;
                    default:
                }
            }
        }
    }
    

     

     


    参考:

    MPAndroidChart折线图详细使用

    MPAndroidChart详解

    MPAndroidChart折线图(LineChart)的使用,可以左右滑动

    Android统计图表MPAndroidChart:动态添加数据更新【6】

    Android图表控件MPAndroidChart——曲线图LineChart(多条曲线)动态添加数据

    Android图表控件MPAndroidChart的简单介绍(MPAndroidChart3.0)

    展开全文
  • 之前有整理过一部分知识点, 一直没有发布, 因为都是有关 前端 方面的零散内容; 现在想想无论分享什么内容都需要慢慢积累, 所以还是决定将之前整理的相关内容验证之后慢慢...2. 子元素的 line-height = 父元素的 line-he

    之前有整理过一部分知识点, 一直没有发布, 因为都是有关 前端 方面的零散内容; 现在想想无论分享什么内容都需要慢慢积累, 所以还是决定将之前整理的相关内容验证之后慢慢分享给大家 这个专题 就是 工作中开发问题总结 相关的内容; 不积跬步,无以至千里, 戒焦戒躁 。

    好了废话不多说, 直接上代码以及图例(为了让大家方便阅读, 都有自己验证过程的一些图片作为分享) 。

    line-height 三种单位简书
     1. 带有单位的 line-height 会被计算成 px 后继承 。
     
     2. 子元素的 line-height = 父元素的 line-height * font-size (如果是 px 了就直接继承)。
     
     3. 而不带单位的 line-height 被继承的是倍数,子元素的 line-height = 子元素的 font-size * 继承的倍数 。
    
    1. 第一种设置 line-height 方式: 在需要的元素标签下设置 line-height: XXpx;
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title> CSS line-height 三种赋值方式的区别 </title>
    </head>
    
    <style>
    .w_line-height p {
      padding: 0;
      margin: 12px 0;
    }
    /* 单位: px */
    .w_line-height-px {
      line-height: 80px;
    }
    .w_line-px {
      font-size: 32px;
      /* 我们在这里可以注释掉当前 line-height 设置, 会发现当前元素的 line-height 是父元素设置的 line-height;
         反之, 当我们在当前元素设置了 line-height 行高, 会覆盖父级元素设置的行高 。
      */
      line-height: 160px;
      background-color: gold;
    }
    </style>
    <body>
      <div class="w_line-height-px w_line-height">
        <p class="w_line-px">单位: px === 父级元素设置 font-size: 16px; 时, 当前元素设置 line-height: 20px; 时 的高度为 20px</p>
      </div>
      </div>
    </body>
    
    </html>
    
    

    b-1.png

    2. 第二种设置 line-height 方式: 父级元素设置 font-size: aapx; 时, 当前元素设置 line-height: bbem; 时 的高度为 aa * bb = yy px
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title> CSS line-height 三种赋值方式的区别 </title>
    </head>
    
    <style>
    .w_line-height p {
      padding: 0;
      margin: 66px 0;
    }
    
    /* 单位: em */
    .w_line-height-em {
      font-size: 16px;
    }
    .w_line-em {
      line-height: 3em;
      background-color: cornflowerblue;
    }
    
    </style>
    <body>
      <div class="w_line-height-em w_line-height">
        <p class="w_line-em">单位: em  ===   父级元素设置 font-size: 16px; 时, 当前元素设置 line-height: 3em; 时 的高度为 48px</p>
      </div>
      </div>
    </body>
    
    </html>
    
    

    b-em.png

    3. 第三种设置 line-height 方式: 父级元素设置 line-height: 16; 时, 当前元素设置 font-size: 12px; 时 的高度为 10 * 18 = 180 px
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title> CSS line-height 三种赋值方式的区别 </title>
    </head>
    
    <style>
    .w_line-height p {
      padding: 0;
      margin: 66px 0;
    }
    /* 单位: 纯数字 */
    .w_line-height-num {
      line-height: 10;
    }
    .w_line-num {
      font-size: 18px;
      /* line-height: 20px; */
      background-color: cyan;
    }
    
    </style>
    <body>
      <div class="w_line-height-num w_line-height">
        <p class="w_line-num">单位: 纯数字  === 父级元素设置 line-height: 16; 时, 当前元素设置 font-size: 12px; 时 的高度为 10 * 18 = 180 px</p>
      </div>
    </body>
    
    </html>
    
    

    b-num.png

    4. 第四种设置 line-height 方式: 父级元素设置 line-height: 500%;(如果浏览器默认 line-height 为 12时计算结果为 5 * 12 ; 如果浏览器默认行高为 16时则计算结果为 5 * 16 ) 时, 当前元素设置 font-size: 24px; 时 的高度为 80px
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title> CSS line-height 三种赋值方式的区别 </title>
    </head>
    
    <style>
    .w_line-height p {
      padding: 0;
      margin: 66px 0;
    }
    /* 单位: 百分比 */
    .w_line-height-percentage {
      /* 谷歌浏览器的默认行高是 16px */
      line-height: 500%;
    }
    .w_line-percentage {
      font-size: 24px;
      background-color: deepskyblue;
    }
    
    </style>
    <body>
      <div class="w_line-height-percentage w_line-height">
        <p class="w_line-percentage">单位: 百分比  === 父级元素设置 line-height: 500%; 时, 当前元素设置 font-size: 24px; 时 的高度为 80px</p>
      </div>
    </body>
    
    </html>
    
    

    b-percentage.png

    5. 完整代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title> CSS line-height 三种赋值方式的区别 </title>
    </head>
    
    <style>
    .w_line-height p {
      padding: 0;
      margin: 66px 0;
    }
    
    
    
    /* 单位: px */
    .w_line-height-px {
      line-height: 80px;
    }
    .w_line-px {
      font-size: 32px;
      /* 我们在这里可以注释掉当前 line-height 设置, 会发现当前元素的 line-height 是父元素设置的 line-height;
         反之, 当我们在当前元素设置了 line-height 行高, 会覆盖父级元素设置的行高 。
      */
      line-height: 160px;
      background-color: gold;
    }
    
    
    /* 单位: em */
    .w_line-height-em {
      font-size: 16px;
    }
    .w_line-em {
      line-height: 3em;
      background-color: cornflowerblue;
    }
    
    
    /* 单位: 纯数字 */
    .w_line-height-num {
      line-height: 10;
    }
    .w_line-num {
      font-size: 18px;
      /* line-height: 20px; */
      background-color: cyan;
    }
    
    
    /* 单位: 百分比 */
    .w_line-height-percentage {
      /* 谷歌浏览器的默认行高是 16px */
      line-height: 500%;
    }
    .w_line-percentage {
      font-size: 24px;
      background-color: deepskyblue;
    }
    
    </style>
    <body>
      <div class="w_line-height-px w_line-height">
        <p class="w_line-px">单位: px === 父级元素设置 line-height: 80px; 时, 当前元素设置 line-height: 160px; 时 的高度为 20px</p>
      </div>
    
      <div class="w_line-height-em w_line-height">
        <p class="w_line-em">单位: em  ===   父级元素设置 font-size: 16px; 时, 当前元素设置 line-height: 3em; 时 的高度为 48px</p>
      </div>
    
      <div class="w_line-height-num w_line-height">
        <p class="w_line-num">单位: 纯数字  === 父级元素设置 line-height: 16; 时, 当前元素设置 font-size: 12px; 时 的高度为 10 * 18 = 180 px</p>
      </div>
    
      <div class="w_line-height-percentage w_line-height">
        <p class="w_line-percentage">单位: 百分比  === 父级元素设置 line-height: 500%; 时, 当前元素设置 font-size: 24px; 时 的高度为 80px</p>
      </div>
    </body>
    
    </html>
    
    

    b-5.png

    如果对你有所帮助,大家可以点个关注;整理知识点不易, 每次都是在工作繁忙之余夜深人静之时整理, 每次整理时都在思考如何让大家更容易理解, 更容易找到、看到自己想看到的内容; 无论知识点是大是小, 我都会验证后再分享, 以防自己发表的文章给大家造成误导。如有问题还望不吝赐教,本人会及时更改 (本文原创, 如需转载,请注明出处) 。

    展开全文
  • Command-Line Arguments 解析

    万次阅读 2018-06-21 09:53:55
    Command-Line Arguments are strings of keywords that you can pass when running the executable via the command line or a shortcut to the executable. Their purpose is to customize the manner in which ...

    声明:

        本文转载链接:https://blog.csdn.net/pizi0475/article/details/48178577


    Command-Line Arguments are strings of keywords that you can pass when running the executable via the command line or a shortcut to the executable. Their purpose is to customize the manner in which the engine runs to suit the needs of the developer or user. This can be as simple as causing the editor to run instead of the game, or it can be much more involved such as starting up the game with a certain map running at a specified resolution and framerate while dumping out each frame to individual image files.

    Modes

    These arguments are used to force the main editor executable (UE4Editor.exe) to run as the game or a server using uncooked content.

    These commands are not case sensitive.

    Example:

    UE4Editor.exe -game
    ArgumentDescription
    -gameLaunch the game using uncooked content.
    -serverRun the game as a server using uncooked content.

    URL Parameters

    URLs can be passed to the executable to force the game to load a specific map upon startup. These can also be used in conjunction with the SERVER or EDITOR modes to run the editor or a server with a specific map. Passing a URL is optional, but must immediately follow the executable name or any mode switch if one is present.

    A URL consists of two parts: a map name or server IP address and a series of optional additional parameters. A map name can be any map located within the Maps directory. The inclusion of a file extension (i.e., .umap) here is optional. To load a map not found in the Maps directory, an absolute path or a relative path from the Maps directory can be used. In this case, the inclusion of the file extension is mandatory. The server IP address is a standard 4-part IP address consisting of 4 values between 0 and 255 separated by periods. The additional options are specified by appending them to the map name or server IP address. Each option is prefaced by a '?', and can set a value with '='. Starting an option with '-' will remove that option from the cached URL options.

    Examples:

    MyGame.exe /Game/Maps/MyMap
    UE4Editor.exe MyGame.uproject /Game/Maps/MyMap?game=MyGameInfo -game
    UE4Editor.exe MyGame.uproject /Game/Maps/MyMap?listen -server
    MyGame.exe 127.0.0.1

    General Options

    ArgumentDescription
    gameTells the engine what GameInfo class to use (overriding default).
    namePlayer name to use.

    Server Options

    ArgumentDescription
    listenSpecify server as a listen server.
    bIsLanMatchSet whether multiplayer game is on the local network (e.g. bIsLanMatch=0).
    bIsFromInviteSpecifies that the player joining was invited.
    spectatoronlyStart the game in spectator mode.

    Switches

    These arguments can be passed to either the game or the editor, depending on the specific keyword and its intended usage. Some arguments are plain switches (i.e., -UNATTENDED) while others are setting switches which are "key=value" pairs (i.e., -LOG=MyLog.txt). These commands are not case sensitive. The syntax for passing plain switches is to preface each argument with a minus '-' and then the argument immediately afterward. Setting switches need no leading '-', with the exception of the server switches.

    Example:

    UE4Editor.exe -silent LOG=MyLog.txt

    Developer

    • ABSLOG: Same as LOG= but without a filename length check.

    • ALLUSERS: Add the game for all users when INSTALLGE is specified.

    • AUTO: Assume yes on all questions. (for example during compile)

    • AUTOCHECKOUTPACKAGES: Automatically checkout packages that need to be saved.

    • AutomatedMapBuild: Perform an automated build of a specified map.

    • BIASCOMPRESSIONFORSIZE: Override compression settings with respect to size.

    • BUILDMACHINE: Set as build machine. Used for deciding if debug output is enabled.

    • BULKIMPORTINGSOUNDS: Use when importing sounds in bulk. (Content Browser specific)

    • CHECK_NATIVE_CLASS_SIZES: Enable checking of native class sizes. Note: Native classes on console platforms will cause native class size checks to fail even though they are assumed to be correct.

    • CODERMODE: Enables Coder mode.

    • COMPATSCALE: Set compatibility settings manually to override PCCompat tool settings.

    • CONFORMDIR: Directory to use when conforming packages.

    • COOKFORDEMO: Specify as cooking packages for the demo.

    • COOKPACKAGES: Tag to specify cooking packages.

    • CRASHREPORTS: Always report crashes of the engine.

    • D3DDEBUG: Use a d3d debug device.

    • DEBUG: Tells the engine to send debug info to the debugger, or build debug packages during script compile.

    • DEVCON: Disable secure connections for developers. (uses unencrypted sockets)

    • DUMPFILEIOSTATS: Track and log File IO statistics.

    • DUMPUDKSURVEY: Simply dump UDK hardware survey. No upload.

    • FATALSCRIPTWARNINGS: Treat script warnings from debugging as fatal.

    • FINAL_RELEASE: Set the FINAL_RELEASE macro for script compiling.

    • FIXEDSEED: Initialize the random number generator with a fixed value, 0.

    • FIXUPTANGENTS: Fix legacy tangents in distributions automatically.

    • FORCELOGFLUSH: Force a log flush after each line.

    • FORCEPVRTC: Force pvrtc texture compression for mobile platform.

    • FORCESOUNDRECOOK: Force a complete re-cook of all sounds.

    • GENERICBROWSER: Use the Generic Browser.

    • INCLUDEUTGAMECONTENT: Set UTGameContent packages to be loaded.

    • INSTALLED: For development purposes, run the game as if installed.

    • INSTALLFW / UNINSTALLFW: Set whether the handling of the firewall integration should be performed.

    • INSTALLGE: Add the game to the Game Explorer.

    • CULTUREFORCOOKING: Set language to be used for cooking.

    • LIGHTMASSDEBUG: Launch lightmass manually with -debug and allows lightmass to be executed multiple times.

    • LIGHTMASSSTATS: Force all lightmass agents to report detailed stats to the log.

    • LOG: When used as a switch (-log), opens a seperate window to display the contents of the log in real time. When used as a setting (LOG=filename.log), tells the engine to use the log filename of the string which immediately follows.

    • LOGTIMES: Print time with log output. (Default, same as setting LogTimes=True in the [LogFiles] section of *Engine.ini)

    • NOCONFORM: Tells the engine not to conform packages as they are compiled.

    • NOCONTENTBROWSER: Disable the Content Browser.

    • NOINNEREXCEPTION: Disables the exception handler within native C++.

    • NOLOADSTARTUPPACKAGES: Force startup packages not to be loaded. You can use this if objects in a startup package must be deleted from within the editor.

    • NOLOGTIMES: Do not print time with log output. (Same as setting LogTimes=False in the [LogFiles] section of *Engine.ini)

    • NOMODAUTOLOAD: Do not automatically load mod classes.

    • NOPAUSE: Close the log window automatically on exit.

    • NOPAUSEONSUCCESS: Close the log window automatically on exit as long as no errors were present.

    • NORC: Disable the remote control. Used for dedicated servers.

    • NOVERIFYGC: Do not verify garbage compiler assumptions.

    • NOWRITE: Disable output to log.

    • OUTPUTHEADERS: Force output of headers on script patch export.

    • SEEKFREELOADING: Only use cooked data.

    • SEEKFREEPACKAGEMAP: Override the package map with the seekfree (cooked) version.

    • SEEKFREELOADINGPCCONSOLE: Only use cooked data for PC console mode.

    • SEEKFREELOADINGSERVER: Only use cooked data for server.

    • SETTHREADNAMES: (Xbox only) Force thread names to be set. This can mess up the XDK COM API which is why it must be explicitly set to be performed if desired.

    • SHOWMISSINGLOC: If missing localized text, return error string instead of English text.

    • SILENT: Disable output and feedback.

    • TRACEANIMUSAGE: Trace animation usage.

    • TREATLOADWARNINGSASERRORS: Force load warnings to be treated as errors.

    • UNATTENDED: Set as unattended. Disable anything requiring feedback from user.

    • UNINSTALLGE: Remove the game from the Game Explorer.

    • USEUNPUBLISHED: Force packages in the Unpublished folder to be used. (deprecated?)

    • VADEBUG: Use the Visual Studio debugger interface.

    • VERBOSE: Set script compiler to use verbose output.

    • VERIFYGC: Force garbage compiler assumptions to be verified.

    • WARNINGSASERRORS: Treat warnings as errors

    Rendering

    • ConsoleX: Horizontal position for console output window.

    • ConsoleY: Vertical position for console output window.

    • WinX: Set the horizontal position of the game window on the screen.

    • WinY: Set the vertical position of the game window on the screen.

    • ResX: Set horizontal resolution for game window.

    • ResY: Set vertical resolution for game window.

    • VSync: Activate the VSYNC via command line. (prevents tearing of the image but costs fps and causes input latency)

    • NoVSync: Deactivate the VSYNC via command line

    • BENCHMARK: Run game at fixed-step in order to process each frame without skipping any frames. This is useful in conjunction with DUMPMOVIE options.

    • DUMPMOVIE: Dump rendered frames to files using current resolution of game.

    • DUMPMOVIE_TILEDSHOT: Dump rendered frames to files using the specified resolution multiplier. Uses tiled shots for high resolution frames (e.g. DUMPMOVIE_TILEDSHOT=4).

    • EXEC: Executes the specified exec file.

    • FPS: Set the frames per second for benchmarking.

    • FULLSCREEN: Set game to run in fullscreen mode.

    • SECONDS: Set the maximum tick time.

    • WINDOWED: Set game to run in windowed mode.

    Network

    • LANPLAY: Tells the engine to not cap client bandwidth when connecting to servers. Causes double the amount of server updates and can saturate client's bandwidth.

    • Limitclientticks: Force throttling of network updates.

    • MULTIHOME: Tells the engine to use a multihome address for networking.

    • NETWORKPROFILER: Enable network profiler tracking.

    • NOSTEAM: Set steamworks to not be used.

    • PORT: Tells the engine to use a specific port number.

    • PRIMARYNET: Affects how the engine handles network binding.

    User

    • NOHOMEDIR: Override use of My Documents folder as home directory.

    • NOFORCEFEEDBACK: Disable force feedback in the engine.

    • NOSOUND: Disable any sound output from the engine.

    • NOSPLASH: Disable use of splash image when loading game.

    • NOTEXTURESTREAMING: Disable texture streaming. Highest quality textures are always loaded.

    • ONETHREAD: Run the engine using a single thread instead of multi-threading.

    • PATHS: Set what paths to use for testing wrangled content. Not used for shipping releases.

    • PREFERREDPROCESSOR: Set the thread affinity for a specific processor.

    • USEALLAVAILABLECORES: Force the use of all available cores on the target platform.

    Server Switches

    • LOGIN: set username to use when logging in.

    • PASSWORD: set password to use when logging in.

    Game Stats/Database

    • NODATABASE: Do not use database. Ignore database connection errors.

    • NOLIVETAGS: Skip loading unverified tag changes from SQL database. Only load for current user.

    INI/Config Files

    • ENGLISHCOALESCED: Revert to the default (English) coalesced .ini if the language-localized version cannot be found.

    • NOAUTOINIUPDATE: Suppress prompts to update .ini files.

    • NOINI: Do not update the .ini files.

    • REGENERATEINIS: forces .ini files to be regenerated.

    Another command line argument may be used to temporarily override which INIs are loaded by the game or editor. For example, if a custom 'MyGame.ini' is to be used instead of 'UDKGame.ini', the argument would be (i.e., -GAMEINI=MyGame.ini). This table lists the arguments used to override the different INI files used in UE4:

    Commandline ArgumentINI Override
    DEFEDITORINI=Default Editor
    EDITORINI=Editor
    DEFEDITORUSERSETTINGSINI=Default EditorUserSettings
    EDITORUSERSETTINGSINI=EditorUserSettings
    DEFCOMPATINI=Default Compat
    COMPATINI=Compat
    DEFLIGHTMASSINI=Default Lightmass
    LIGHTMASSINI=Lightmass
    DEFENGINEINI=Default Engine
    ENGINEINI=Engine
    DEFGAMEINI=Default Game
    GAMEINI=Game
    DEFINPUTINI=Default Input
    INPUTINI=Input
    DEFUIINI=Default UI
    UIINI=UI

    Debugging

    • BugLoc (e.g. BugLoc=(X=1798.8569,Y=475.9513,Z=-8.8500))

    • BugRot (e.g. BugRot=(Pitch=-1978,Yaw=-7197,Roll=0))

    Misc.

    • timelimit (e.g. timelimit=[time])

    • goalscore (e.g. goalscore=[score])

    • numbots (e.g. numbots=[num])

    展开全文
  • private void initChart(LineChart lineChart) { /***图表设置***/ //是否展示网格线 lineChart.setDrawGridBackground(false); //是否显示边界 lineChart.setDrawBorders(true); //是否可以拖动 lineChart....
  • Jeecg-Boot2.1.2 版本,手工集成Online在线开发模块(Online表单、Online报表) 友情提醒: 如果你想去掉Online模块,也可以参考此文档 1、ant-design-jeecg-vue前端项目引入 online 依赖 Install安装 yarn ...
  • json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 1 )
  • Online Learning算法理论与实践

    万次阅读 2018-09-15 20:50:39
    本文主要介绍Online Learning的基本原理和两种常用的Online Learning算法:FTRL(Follow The Regularized Leader)[1]和BPR(Bayesian Probit Regression)[2],以及Online Learning在美团移动端推荐重排序的应...
  • Error running ‘JeecgSystemCloudApplication’: Command line is too long. Shorten command line for Application or aalso for Spring Boot default configuration 解决办法: 修改Edit>Configuration>...
  • 本文主要讲解的是Three.js中三种线条LineLineLoop,LineSegments之间的区别,每种线条的原理和对应参数的含义,以及如何选择使用场景等问题。Three.js中提供了两种线条材质,分别是LineBasicMaterial和...
  • 谈谈Line-height的深入理解 与 应用

    千次阅读 2017-11-19 12:43:25
    一、前言 前两天在腾讯ISD团队博客上看到一篇翻译的文章“深入理解css 行高”,是个不错的文章,学到了不少东西,建议...另外,将结合实际,展示line-height的一些特性和一些常见应用,帮助您对css行高line-height...
  • Line-in和Mic-in及Line-out的使用和介绍

    千次阅读 2020-07-08 19:11:57
    Line-in和Mic-in的区别: http://blog.163.com/why.ann_2001/blog/static/331376200821391621467/ 我们的电脑声卡上,一般都会有Line in和Mic in两个接口,翻译成中文就是“线性输入”和“麦克风输入”,这两个都...
  • Android实现Line登录分享

    千次阅读 2018-12-29 12:00:14
    1、注册登录Line开发者账号 在Line官网并找不到注册地方,可以通过Line APP进行注册,注册之后进入Line开发者官网:https://developers.line.me/en/进行开发者账号授权。 2、创建应用 3、创建完成在Channel ...
  • 说明上述模块:第1行代码:从pyecharts.charts导入Line模块。Line是折线图模块,是用来生成折线图的。 第2行代码:导入pyecharts模块下的子模块options取别名为opts,使用 options 配置项,在 pyecharts 中,一切皆...
  • json.decoder.JSONDecodeError: Invalid \escape: line 1 column 1 (char 1)
  • Unity中使用LineRenderer进行绘制

    千次阅读 2020-07-10 14:05:12
    ——当鼠标按下时,创建一个空物体并添加LineRenderer组件,设置当前线段的各种参数注意需要设置一个LineRenderer的材质Shader(可以接受颜色的,比如Sprites/Default或Legacy Shaders/Particles/Alpha Blended ...
  • CacheLine对齐

    千次阅读 2020-02-27 13:38:00
    CacheLine 总所周知,计算机将数据从主存读入Cache时,是把要读取数据附近的一部分数据都读取进来 这样一次读取的一组数据就叫做CacheLine,每一级缓存中都能放很多的CacheLine 多核CUP L1、L2、L3指一级缓存,二...
  • cache line大小

    千次阅读 2019-07-12 16:53:43
    我们都知道cache的作用是把主存储器的数据到寄存器的一个缓冲区,被称为高速缓存,其能够大大提高程序的性能,那么cache的性能受cache line size的影响很大。cache line大小到底有多大,其实它和和内存的一个参数...
  • Command line is too long. Shorten command line for ***Application or also for Spring Boot default configuration. 原因分析 出现这个问题的原因是因为idea在启动项目时,加载的启动参数过长导致,我们可以...
  • 在使用IntelliJ IDEA工具开发项目的过程中遇到一个梗,项目准备就绪,可是启动不起来,报 “Command line is too long,Shorten command line for WebApplication or also for Spring Boot default configuration....
  • 前几天优化服务性能在cat看到了一些title 大部分都很好理解 其中95line、99.9line是什么就不理解了 查询百度没查到啥,反而查到了
  • SharePoint 2016 安装和部署office line 一部署office online 重要声明;由于没有中文版本,再加上本人英文实在太烂,有洁癖的请自动走开。本文是介绍安装规划。 Office Online server 软硬件需求  我称其为OOS...
  • 1.找到.idea下的workspace.xml 2.搜索找到PropertiesComponent 在下面加入一行 <property name="dynamic.classpath" value="true" /> 如图:
  • 计算机缓存Cache以及Cache Line详解

    万次阅读 多人点赞 2018-06-06 10:56:36
    组确定了之后,【12,31】的内存地址与组中8个line挨个比对,如果【12,31】为与某个line一致,并且这个line为有效,那么缓存命中。 OK,我们可以将cache分成三类,   直接映射高速缓存 ,这个简单,即每个...
  • Docker 部署在线文件转换服务--Libre Office Online简述一、Docker 部署1. Docker 离线安装2. Docker 加入开机自启与配置2.1 查看安装的Docker CE 版本:2.2 修改 `docker.service` 启动文件2.2.1 修改远程连接的...
  • javafx直线类Line

    千次阅读 2019-04-26 20:22:17
    Line Line继承与Shape,而Shape继承与Node,对于Node的子类,都可以设置基本的监听器,鼠标事件和键盘事件,当然样式设置也是有的。 圆线图 代码 public class JacobLine extends Application{ public ...
  • 在线学习算法(Online Learning)理论与实践

    万次阅读 多人点赞 2018-11-08 21:17:38
    本文主要介绍Online Learning的基本原理和两种常用的Online Learning算法:FTRL(Follow The Regularized Leader)[1]和BPR(Bayesian Probit Regression)[2],以及Online Learning在美团移动端推荐重...
  • CSS深入理解之line-height

    万次阅读 2018-01-26 14:16:23
    line-height 一、line-height的定义 行高line-height,两行文字基线之间的距离。 1、什么是基线?字符(x)下边缘 2、为什么是基线?基线是*线定义之根本。 3、需要两行么?不需要,两行的定义决定了一行的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,885,681
精华内容 1,154,272
关键字:

line