Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将MPAndroidChart图表保存到图像,而不在“活动”中显示_Java_Android - Fatal编程技术网

Java 将MPAndroidChart图表保存到图像,而不在“活动”中显示

Java 将MPAndroidChart图表保存到图像,而不在“活动”中显示,java,android,Java,Android,我想生成PDF,但首先我需要从折线图(MPAndroidChart库)创建一个图像,而不在活动中显示它 我遵循了本教程,并根据自己的要求修改了代码: private void createLineChart(double frequency) { LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); RelativeLayou

我想生成PDF,但首先我需要从折线图(MPAndroidChart库)创建一个图像,而不在活动中显示它

我遵循了本教程,并根据自己的要求修改了代码:

private void createLineChart(double frequency) {

    LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    RelativeLayout view = new RelativeLayout(activity);
    inflater.inflate(R.layout.line_chart_layout, view, true);

    LineChart lc = view.findViewById(R.id.lncMain);
    lc.setData(createLineData(frequency));
    lc.invalidate();

    view.setLayoutParams(new LinearLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));

    view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));

    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());

    Bitmap b = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);

    Canvas c = new Canvas(b);
    view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
    view.draw(c);

    String filename = "graph.png";
    File sd = Environment.getExternalStorageDirectory();
    File dest = new File(sd, filename);

    try {
        FileOutputStream out = new FileOutputStream(dest);
        b.compress(Bitmap.CompressFormat.PNG, 90, out);
        out.flush();
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

    Log.i(TAG, filename);
}
activity
变量是
AppCompatActivity
的一个实例。
R.layout.line\u图表\u布局
的内容:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layParent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    >

    <com.github.mikephil.charting.charts.LineChart
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/lncMain"
        android:orientation="horizontal"
        >

    </com.github.mikephil.charting.charts.LineChart>

</RelativeLayout>

一旦应用程序被执行,我会得到一个名为
graph.png
的图像文件,但它的内容不会影响所需的绘图:


我尝试了
视图.setLayoutParams
视图.layout
的不同值,但不起作用。。。请给我一些建议

我猜graph.png看起来很混乱,因为
折线图从来没有真正添加到
活动的布局中,所以它的“实际大小”计算不正确。我知道您不想向用户显示图表,但可以通过设置
视图
不可见来实现

以下是我的版本:

public class MainActivity extends AppCompatActivity {

    private  LineChart lc;
    private RelativeLayout view;

    private static final String TAG = "LCTP Main";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onResume() {
        super.onResume();
        if(Build.VERSION.SDK_INT > 22 && (checkSelfPermission(WRITE_EXTERNAL_STORAGE) != PERMISSION_GRANTED)) {
            requestPermissions(new String[]{READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE}, 13);
        }
        else {
            createLineChart(440.0);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode == 13){
            boolean ok = true;
            int length = permissions.length;
            for (int i = 0; i < length; i++) {
                String permission = permissions[i];
                if(grantResults[i] != PERMISSION_GRANTED){
                    Log.d(TAG, "onRequestPermissionsResult: missing permission " + permission);
                    ok = false;
                }
            }
            if(ok){
                createLineChart(220);
            }
        }
    }

    private void createLineChart(double frequency) {
        if(lc == null){
            view = findViewById(R.id.layParent);
            lc = findViewById(R.id.lncMain);
        }
        lc.setData(createLineData(frequency));

        view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                Bitmap b = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);

                Canvas c = new Canvas(b);
                view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
                view.draw(c);

                String filename = "graph.png";
                File sd = Environment.getExternalStorageDirectory();
                File dest = new File(sd, filename);

                try {
                    FileOutputStream out = new FileOutputStream(dest);
                    b.compress(Bitmap.CompressFormat.PNG, 90, out);
                    out.flush();
                    out.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }

                Log.i(TAG, filename);
            }
        });
        lc.invalidate();
    }

    private LineData createLineData(double frequency) {
        List<Entry> yVals = new ArrayList<>();
        for(int i = 0; i < frequency; i = i + 10){
            yVals.add(new Entry(i, (float)Math.sin(i*i)));
        }
        ILineDataSet lineDataSet = new LineDataSet(yVals, "LabelString");
        LineData lineData = new LineData(lineDataSet);
        return lineData;
    }
}
public类MainActivity扩展了AppCompatActivity{
私人线形图lc;
私人相对论;
私有静态最终字符串TAG=“LCTP Main”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@凌驾
受保护的void onResume(){
super.onResume();
if(Build.VERSION.SDK\u INT>22&(选中自许可(写入外部存储)!=许可已授予)){
requestPermissions(新字符串[]{READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE},13);
}
否则{
createLineChart(440.0);
}
}
@凌驾
public void onRequestPermissionsResult(int-requestCode,@NonNull-String[]permissions,@NonNull-int[]grantResults){
super.onRequestPermissionsResult(请求代码、权限、授权结果);
if(requestCode==13){
布尔ok=true;
int length=permissions.length;
for(int i=0;i
activity_main.xml:

<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:padding="24dp"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Hello World!"/>

    <include
        layout="@layout/line_chart_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="invisible"/>

</LinearLayout>

生成的png: