Search code examples
javaandroidprintingview

Print invoices in special mode with View


Code View

private View getViewFactor() {
    double count = 0.0;
    int coint_box = 0;

    LayoutInflater li = LayoutInflater.from(getApplicationContext());
    View factor = li.inflate(R.layout.factor_pattern, null);

    ((TextView) factor.findViewById(R.id.factor_serial)).setText(factSerial);
    ((TextView) factor.findViewById(R.id.date)).setText(getDate());
    ((TextView) factor.findViewById(R.id.com)).setText(assistance.getCompany());
    ((TextView) factor.findViewById(R.id.name)).setText(userSelect.getName());
    ((TextView) factor.findViewById(R.id.phone)).setText(userSelect.getPhone());
    ((TextView) factor.findViewById(R.id.price_total)).setText(getNumber(assistance.convertFatoEn(String.valueOf(totalPreice))));
    ((TextView) factor.findViewById(R.id.offer_total)).setText(getNumber(String.valueOf(totalTakhfif)));

    ((TextView) factor.findViewById(R.id.finish_price)).setText(getNumber(String.valueOf((int) (Double.parseDouble(totalPreice) - totalTakhfif))));

    if (userSelect.getBalance().substring(0, 1).equals("-")) {
        ((TextView) factor.findViewById(R.id.bedehkari)).setText(getNumber(userSelect.getBalance().substring(1)));
        ((TextView) factor.findViewById(R.id.payment_price)).setText(
                getNumber(String.valueOf((int) (Double.parseDouble(totalPreice) -
                        totalTakhfif)+Double.parseDouble(userSelect.getBalance().substring(1)))));
    } else {
        ((TextView) factor.findViewById(R.id.bedehkari)).setText("0");
        ((TextView) factor.findViewById(R.id.payment_price)).setText(
                getNumber(String.valueOf((int) (Double.parseDouble(totalPreice) -
                        totalTakhfif))));
    }

    for(int i=0;i<modelCommodityList.size();i++){
        LayoutInflater li1 = LayoutInflater.from(getApplicationContext());

        View item = li1.inflate(R.layout.factor_item, null);
        count+=modelCommodityList.get(i).getCount();
        ((TextView) item.findViewById(R.id.name)).setText(modelCommodityList.get(i).getName());
        ((TextView) item.findViewById(R.id.count1)).setText(String.valueOf(modelCommodityList.get(i).getCount()));
        ((TextView) item.findViewById(R.id.fi)).setText(getNumber(String.valueOf(modelCommodityList.get(i).getPrice())));
        ((TextView) item.findViewById(R.id.price)).setText(
               getNumber( String.valueOf((int) (modelCommodityList.get(i).getCount()*Integer.parseInt(modelCommodityList.get(i).getPrice())))));

        if(modelCommodityList.get(i).getZ1()!=0) {
            ((TextView) item.findViewById(R.id.count_box)).setText(
                    String.valueOf((int) (modelCommodityList.get(i).getCount()/modelCommodityList.get(i).getZ1())));
            coint_box+=(int) (modelCommodityList.get(i).getCount()/modelCommodityList.get(i).getZ1());
        }else {
            ((TextView) item.findViewById(R.id.count_box)).setText("0");
        }

        ((AppCompatTextView) factor.findViewById(R.id.count)).setText(String.valueOf(count));
        ((AppCompatTextView) factor.findViewById(R.id.count_box10)).setText(String.valueOf(coint_box));

        ((LinearLayout) factor.findViewById(R.id.recycler10)).addView(item);
    }

    return factor;
}

and I convert view to bitmap by

private Bitmap createBitmapFromView(Context context, View view) {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    view.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));

    view.measure(displayMetrics.widthPixels, displayMetrics.heightPixels);
    view.layout(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels);
    view.buildDrawingCache();
    Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), 10000, Bitmap.Config.ARGB_8888);

    Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);
    return bitmap;

When I have a lot of products and I add them to the view and convert the view into a bitmap, the bitmap I receive is incomplete. It does not show the view completely because the height of my view increased; it only converts half of the view.


Solution

  • I made it this way but I do not know if it is completely correct or not

     private Bitmap createBitmapFromView(Context context, View view) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    
        view.measure(displayMetrics.widthPixels, displayMetrics.heightPixels*2);
        view.layout(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels*2);
        view.buildDrawingCache();
        Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight()+50, Bitmap.Config.ARGB_8888);
    
        Canvas canvas = new Canvas(bitmap);
        view.draw(canvas);
        return bitmap;
    
    }