2016-05-25 15 views
0

キャンバスに円を描こうとしています。現在、私はボタンクリックでそれを行うことができますが、Fragmentがロードされているときも同じことをする必要があります。以下は私のFragmentコードです。以下はUIスレッドからメソッドを呼び出す必要があります。現在推定されているスレッドはworkerです

public class StepTwentyOneFragment extends Fragment { 

    private CanvasView customCanvas; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.step21_fragment, container, false); 
     customCanvas=(CanvasView)v.findViewById(R.id.signature_canvas); 

     final Button button1=(Button)v.findViewById(R.id.step18button1); 


     float radius=(customCanvas.getCanvasWidth()/2) - ((customCanvas.getCanvasWidth()/2)/100)*60; 
     new MyAsyncTask(customCanvas).execute(); 

     button1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       if(v.getId()==R.id.step18button1){ 

        float radius=(customCanvas.getCanvasWidth()/2) - ((customCanvas.getCanvasWidth()/2)/100)*60; 
        customCanvas.drawCircle(radius); 
        Log.d("An_Width", "" + customCanvas.getCanvasWidth()); 
        Log.d("An_Height" ,""+ customCanvas.getCanvasHeight()); 

        v.setBackgroundResource(R.drawable.button_border_5); 
        button1.setTextColor(Color.WHITE); 


       } 
      } 
     }); 






     return v; 
    } 

    public static StepTwentyOneFragment newInstance() { 

     StepTwentyOneFragment f = new StepTwentyOneFragment(); 
     Bundle b = new Bundle(); 

     f.setArguments(b); 

     return f; 
    } 


    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
     if(isVisibleToUser) { 
      Activity a = getActivity(); 
      if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     } 
    } 

    public class MyAsyncTask extends AsyncTask<Void, Void, Void> { 

     CanvasView myTaskView; 

     MyAsyncTask(CanvasView v){ 
      myTaskView = v; 
     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 

      myTaskView.drawCircle(150); 
      return null; 
     } 

    } 

} 

Fragmentにしかし私Canvasコード

public class CanvasView extends View { 

    public int width; 
    public int height; 
    private Bitmap mBitmap; 
    private Canvas mCanvas; 
    private Path mPath; 
    Context context; 
    private Paint mPaint; 
    private float mX, mY; 
    private static final float TOLERANCE = 5; 
    private int canvasHeight, canvasWidth; 
    private float radius; 

    public CanvasView(Context c, AttributeSet attrs) { 
     super(c, attrs); 
     context = c; 

     mPath = new Path(); 

     mPaint = new Paint(); 
     mPaint.setStrokeWidth(3); 
     mPaint.setColor(Color.CYAN); 
    } 

    // override onDraw 
    @Override 
    protected void onDraw(Canvas canvas) { 

     super.onDraw(canvas); 

     mCanvas=canvas; 

     Drawable d = getResources().getDrawable(R.drawable.circle_1); 

     canvasHeight= canvas.getHeight(); 
     canvasWidth= canvas.getWidth(); 

     Log.d("Height - ","/"+canvas.getHeight()); 
     Log.d("Width - ","/"+canvas.getWidth()); 

//   DisplayMetrics displaymetrics = new DisplayMetrics(); 
//  ((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
//  int height = displaymetrics.heightPixels; 
//  int width = displaymetrics.widthPixels; 

     float h=canvasHeight/2; 
     float w=canvasWidth/2; 


     d.setBounds(0, 0, canvasWidth, canvasHeight); 
     d.draw(canvas); 

     canvas.drawCircle(w, h, radius, mPaint); 
    } 

    public void clear2(){ 
     radius=0; 
     //important. Refreshes the view by calling onDraw function 
     invalidate(); 

    } 

    public void drawCircle(float radius1) { 

     radius=radius1; 
     //important. Refreshes the view by calling onDraw function 
     invalidate(); 

    } 

    public int getCanvasHeight() 
    { 
     return canvasHeight; 
    } 

    public int getCanvasWidth() 
    { 
     return canvasWidth; 
    } 

} 

で、MyAsyncTaskの内側には、エラーコードの行のMethod drawCircle must be called from the UI thread, currently inferred thread is workermyTaskView.drawCircle(150);

は、私はこれをどのように修正することができます示して?

+0

'myTaskView.drawCircle(150);'ラインρяσѕρєя[email protected]非UIスレッド –

+0

からdrawcircleを呼び出す前に、問題の原因:右、それを修正する方法?。その部分を 'onCreate'から直接呼び出しても何もしなかったので、fragmnetがロードされたときに円を描くにはこのスレッド内になければならないと思いますか? – Barrier

+0

onPostExecuteメソッドで移動 –

答えて

1

doInBackground()で実装している場合は、UIスレッドに何も表示できません。それはバックグラウンドタスクです。 UIを更新するには、postexecute()でメソッドを実装する必要があります。

AsyncTaskについて詳しく読む:https://developer.android.com/reference/android/os/AsyncTask.html

クリアあなたの概念は、AsynTaskを使用することが容易になります。

基本AsyncTaskの構造:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
      // Escape early if cancel() is called 
      if (isCancelled()) break; 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 
+0

この 'onPostExecute'メソッドはどこにありますか? – Barrier

+0

@Barrier編集された回答を参照してください。 onProgressUpdate()は、作業の進捗状況を表示する場合はオプションです。 –

+0

私は渡すべきパラメータは何ですか?私は全くパラメータを持っていません – Barrier

関連する問題