2012-02-15 30 views
6

Mô tả PROBLEM:
Tôi đã thử nghiệm hai phương pháp sau để tạo ảnh chụp nhanh bitmap từ Chế độ xem (ví dụ: RelativeLayout trong trường hợp này). Cả hai phương pháp đều hoạt động tuyệt vời cho Chế độ xem mà thứ nguyên (ví dụ: chiều rộng và chiều cao) nhỏ hơn kích thước của màn hình thiết bị (ví dụ: 480x900). Phần hiển thị của Chế độ xem được ghi lại và được ghi vào bitmap. Thật không may, bitmap là màu đen trong phần không nhìn thấy được của View.Android: Bitmap từ chế độ xem quá khổ

CÂU HỎI:
Tôi cũng có thể nắm bắt phần vô hình của Chế độ xem như thế nào?

Mã sản phẩm:

public class NewRelativeLayout extends RelativeLayout{ 

private Bitmap bmp; 

public NewRelativeLayout(Context context){ 
    super(context); 
    this.setLayoutParams(new RelativeLayout.LayoutParams(2000,2000)); 
    // add here methods to configure the RelativeLayout or to add children 
    } 

//This is the first method 
public void makeSnapshot_Method1(){ 
    this.setDrawingCacheEnabled(true); 
    bmp = Bitmap.createBitmap(this.getDrawingCache()); 
    this.setDrawingCacheEnabled(false); 
    } 

//This is the second method 
public void makeSnapshot_Method2(){ 
    bmp = Bitmap.createBitmap(2000, 2000, Bitmap.Config.ARGB_8888); 
    Canvas helpCanvas = new Canvas(bmp); 
    this.draw(helpCanvas); 
    } 

}

Trả lời

0

Tùy thuộc vào đó hình ảnh bạn muốn chụp, hình ảnh từ phía trước hoặc sau quan điểm của. Dù bằng cách nào bạn cũng có thể lấy đối tượng Drawable từ chúng, chuyển chúng sang BitmapDrawable và lấy Bitmap từ chúng. Mã: -

BitmapDrawable bd=(BitmapDrawable) view.getBackground(); //if you need background image 
BitmapDrawable bd=(BitmapDrawable) view.getDrawable(); //if you need foreground image (Only available to some views who have an android:src xml property) 
Bitmap bm=bd.getBitmap(); 

Tôi hy vọng điều này sẽ phù hợp với bạn.

+0

Cảm ơn người tạo vì phản hồi nhanh của bạn. Phương thức view.getDrawable() chỉ được hỗ trợ bởi Views, trong đó "giữ" một hình ảnh nền trước bên trong như ImageView chẳng hạn. Tất cả các Chế độ xem khác như RelativeLayouts, LinearLayouts, TextViews, v.v. không hỗ trợ phương thức này. Hầu hết các diễn đàn internet đều đề xuất phương pháp 1 hoặc 2 (xem bài đăng của tôi) để tạo ảnh chụp màn hình bitmap (tức là nền cộng với nền trước) từ Chế độ xem. Vấn đề vẫn chưa được giải quyết cho các lượt xem quá khổ. Bất kỳ ý tưởng nào khác? –

+0

Vâng, tôi đã đề cập rằng view.getDrawable() không được hỗ trợ bởi mọi chế độ xem trong bài đăng. Hai phương pháp này cung cấp hình ảnh hoàn chỉnh, bao gồm các phần ngoài màn hình, bạn có thể thử đặt hai hình ảnh riêng biệt đó trong một chế độ xem (nếu hình nền là hình nền png trong suốt) bằng canvas và chế độ xem tùy chỉnh và lấy có thể rút ra từ đó, mặc dù tôi chưa bao giờ thử điều đó, vì vậy không thể biết cách làm việc này, nhưng nếu bạn có thể làm theo đó bạn có thể đạt được những gì bạn cần. – noob

+0

Phương thức getDrawingCache() chỉ nhằm cung cấp cho hình ảnh trên màn hình, vì vậy tôi không nghĩ rằng nó sẽ làm việc cho bạn. Sử dụng getDrawingCache (true) có thể làm việc cho bạn. Một ý tưởng khác có thể là thay đổi kích thước chế độ xem bằng cách sử dụng LayoutParams để vừa với màn hình và sau đó lấy bộ nhớ cache bản vẽ từ đó. – noob

0

Tôi cũng đang cố gắng tìm ra điều này cho một ListView, để có được tất cả các hàng không có trên màn hình.

Tôi đã tìm thấy rất nhiều điều tôi muốn chia sẻ:

Ở đây ai đó hỏi nếu một bitmap có thể được tạo ra từ một cái nhìn mà không rút ra: Bitmap from View not displayed on Android

Ở đây họ tuyên bố đó là một bản sao và nó cũng trả lời đúng (?) Nó chứa một URL với một số mã hóa cũ và không biên dịch. Ngoài ra câu hỏi trùng lặp có thể không giúp tôi. Android get full View as Bitmap

Tôi nghĩ rằng tôi sẽ cố gắng làm cho nó thực hiện thông qua phương pháp này: List View using bitmap Đã nảy ra ý tưởng tương tự, bây giờ tôi vẫn phải khám phá cách.

Hy vọng bạn có thể sử dụng một số thông tin này.

1

Tôi cũng đang tìm kiếm giải pháp cho điều này và cuối cùng, tôi đã tìm ra giải pháp của riêng mình thực sự khá đơn giản.

Trong trường hợp của tôi, tôi có một số LinearLayout có chứa một số yếu tố View, một số trong đó đôi khi không có trên màn hình, theo chiều dọc bên dưới phần cuối của giới hạn màn hình. Tôi đã có thể lưu View dưới dạng bitmap (xem loadBitmapFromView(), bên dưới) nhưng gặp sự cố khi mở rộng ra phía dưới màn hình.

Giải pháp của tôi là làm cho phần LinearLayout của tổng hợp ScrollView.

ví dụ:

này:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/my_linear_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
> 
<!-- Some Views added here at runtime --> 
</LinearLayout> 

Trở thành:

Lưu ý sử dụng wrap_content để đảm bảo scrollview quy mô với chiều cao nội dung của bạn.

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scroll" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    > 

    <LinearLayout 
     android:id="@+id/my_linear_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
    > 
     <!-- Some Views added here at runtime --> 
    </LinearLayout> 
</ScrollView> 

Điều này dường như đảm bảo rằng các mục có thể được tắt thủ công khi tôi muốn lưu View làm bitmap. Tôi đã sử dụng phương pháp sau để lưu bitmap. Tôi tìm thấy điều này sớm hơn nhiều về SO nhưng tôi dường như không thể tìm thấy câu hỏi để tham khảo nó đúng cách (bất cứ ai bạn - cảm ơn bạn!).

Đối với phương pháp sau, tôi chuyển một tham chiếu đến LinearLayout ở trên (my_linear_layout).

public static Bitmap loadBitmapFromView(View view) { 
    Bitmap bitmap = null; 

    // width measure spec 
    int widthSpec = View.MeasureSpec.makeMeasureSpec(
      view.getMeasuredWidth(), View.MeasureSpec.AT_MOST); 
    // height measure spec 
    int heightSpec = View.MeasureSpec.makeMeasureSpec(
      view.getMeasuredHeight(), View.MeasureSpec.AT_MOST); 

    // measure the view 
    view.measure(widthSpec, heightSpec); 

    // set the layout sizes 
    int left = view.getLeft(); 
    int top = view.getTop(); 
    int width = view.getMeasuredWidth(); 
    int height = view.getMeasuredHeight(); 
    int scrollX = view.getScrollX(); 
    int scrollY = view.getScrollY(); 

    view.layout(left, top, width + left, height + top); 

    // create the bitmap 

    bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), 
      Bitmap.Config.ARGB_8888); 

    // create a canvas used to get the view's image and draw it on the 
    // bitmap 

    Canvas c = new Canvas(bitmap); 
    // position the image inside the canvas 
    c.translate(-view.getScrollX(), -view.getScrollY()); 
    // get the canvas 
    view.draw(c); 

    return bitmap; 
} 
Các vấn đề liên quan