2016-08-08 6 views
2

画像ボタンビューに添付されたontouchlistner内から画像ボタンビュー(appcompatimagebutton)でgetDrawingCache()が返される理由を理解してください。レイアウト後にgetDrawingCache()がnullを返す

主に、この問題を解決しようとする中で、私はこの質問を参照されました:私の問題を解決していない

Android View.getDrawingCache returns null, only null

。私は何かを見落としているか、何かを完全に理解していないと確信しています。それが何であるか把握してください。

注:

1)実際のプロジェクトで、私はそれがのImageButtonがないことを提供しています機能)を必要とするので、私はのImageButtonまたはAppCompatImageButtonを使用します(しかし、私はAPPCOMPAT使用しています何の違いの天気をしないように思われます。

2)ユーザーがontouch()を起動したときにレイアウトが既に描画されているため、ビューのメジャーとレイアウトメソッドを呼び出す必要があるのはわかりませんが、とにかく私が見つけた多くの答えは、これが必要であることを示しているようでした。私もそれらを取り除くとうまくいきません。

3)setEnableDrawingCacheおよびbuildDrawingCache呼び出しをonTouchに配置するか、またはAppCompatImageButtonビューの初期化を使用してonCreateを呼び出すかは関係ありません。どちらの場合でも、画像ボタンビューのgetDrawingCacheへのontouchlistener呼び出しはnullを返します。ここ


は、コードサンプルは、

感謝です!

public class MainActivity extends AppCompatActivity { 
    AppCompatImageButton mImageButton; 
    Bitmap mBitmapDrawingCache; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //create image button 
     mImageButton = new AppCompatImageButton(this); 
     FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(270, 270); 
     mImageButton.setLayoutParams(layoutParams); 

     //getDrawingCache() in ontouchlistener returns null regardless if this is set 
     int mseWidth = View.MeasureSpec.makeMeasureSpec(270, View.MeasureSpec.EXACTLY); 
     int mseHeight = View.MeasureSpec.makeMeasureSpec(270, View.MeasureSpec.EXACTLY); 
     mImageButton.measure(mseWidth, mseHeight); 
     mImageButton.layout(0, 0, 270, 270); 
     /* this does not work either 
     int mseWidth = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 
     int mseHeight = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 
     mImageButton.measure(mseWidth, mseHeight); 
     mImageButton.layout(0, 0, mImageButton.getMeasuredWidth(), mImageButton.getMeasuredHeight()); 
     */ 

     //getDrawingCache() in ontouchlistner returns null regardless if either, both or none of these are set 
     //mImageButton.buildDrawingCache(); 
     mImageButton.setDrawingCacheEnabled(true); 

     //attach image button view to content view 
     ((FrameLayout) findViewById(android.R.id.content)).addView(mImageButton); 

     //set touch listener 
     mImageButton.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       //why is this line returning null instead of a Bitmap ? 
       mBitmapDrawingCache = Bitmap.createBitmap(v.getDrawingCache()); 

       Log.d("TAG_A", mBitmapDrawingCache.toString()); 

       return false; 
      } 
     }); 
    } 
} 

答えて

0

あなたのビューからビットマップを得るために、あなたはキャッシュを生成する順番は次のようなものです:あなたはOnTouchListener以上好ましくOnClickListener(内部ですべて一緒にこれを呼び出す必要が

mImageButton.setDrawingCacheEnabled(true); 
mImageButton.buildDrawingCache(); 
mBitmapDrawingCache = Bitmap.createBitmap(mImageButton.getDrawingCache()); 

クリックするとビットマップを生成したい場合)。

しかし、私がなぜMeasureSpecのすべてのものを呼び出すのかはわかりません... setContentView(R.layout.activity_main);を通して画像をロードする場合は、すべての手動測定に煩わされることはありません。

+0

ご返信ありがとうございます。これらの通話をonClickに配置することは、私の設計にとって好ましくありません。私がそれをテストするときにonTouchにそれらの呼び出しを置くことは私のために働かない。これが他の人のために働いているのであれば、テストしているハードウェアに特有のものがないのだろうか?これはいくつかのデバイスで動作し、他のデバイスでは動作しない可能性がありますか? – dl77sea

関連する問題