2012-12-20 113 views
2

我的代碼:如何動態地將字符串值傳遞給另一個類中的textview?

編輯按評論格雷厄姆·

PaintView.java

public class PaintView extends View { 

private Bitmap mBitmap; 
private Canvas mCanvas; 
private Path mPath; 
private Paint mPaint; 
private static final int TOUCH_TOLERANCE_DP = 20; 
private static final int BACKGROUND = 0xFFDDDDDD; 
private List<Point> mPoints = new ArrayList<Point>(); 
private int mLastPointIndex = 0; 
private int marks = 0; 
private int mTouchTolerance; 
private boolean isPathStarted = false; 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.drawColor(BACKGROUND); 
    canvas.drawBitmap(mBitmap, 0, 0, null); 
    canvas.drawPath(mPath, mPaint); 

    // TODO remove if you dont want points to be drawn 
    for (Point point : mPoints) { 
     canvas.drawPoint(point.x, point.y, mPaint); 
    } 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    float x = event.getX(); 
    float y = event.getY(); 

    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      touch_start(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touch_move(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_UP: 
      touch_up(x, y); 
      invalidate(); 
      break; 
    } 
    return true; 
} 

private void touch_start(float x, float y) { 

    if (checkPoint(x, y, mLastPointIndex)) { 
     mPath.reset(); 
     // user starts from given point so path can beis started 
     isPathStarted = true; 
    } else { 
     // user starts move from point which doen's belongs to mPinst list 
     isPathStarted = false; 
    } 

} 

//ADDED WITH LAST EDIT 
private void touch_move(float x, float y) { 
    // draw line with finger move 
    if (isPathStarted) { 
     mPath.reset(); 
     Point p = mPoints.get(mLastPointIndex); 
     mPath.moveTo(p.x, p.y); 
     if (checkPoint(x, y, mLastPointIndex + 1)) { 
      p = mPoints.get(mLastPointIndex + 1); 
      mPath.lineTo(p.x, p.y); 
      mCanvas.drawPath(mPath, mPaint); 
      mPath.reset(); 
      ++mLastPointIndex; 
      marks++; 
      update(); 
     } else { 
      mPath.lineTo(x, y); 
     } 
    } 
} 

private void update() { 
    // TODO Auto-generated method stub 
    String newMarks = ""; 
    newMarks = Integer.toString(marks); 
    Log.e("Marks", ":" + newMarks); 
} 

/** 
* Draws line. 
*/ 
private void touch_up(float x, float y) { 
    mPath.reset(); 
    marks--; 
    update(); 
    if (checkPoint(x, y, mLastPointIndex + 1) && isPathStarted) { 
     // move finished at valid point so draw whole line 

     // start point 
     Point p = mPoints.get(mLastPointIndex); 
     mPath.moveTo(p.x, p.y); 
     // end point 
     p = mPoints.get(mLastPointIndex + 1); 
     mPath.lineTo(p.x, p.y); 
     mCanvas.drawPath(mPath, mPaint); 
     mPath.reset(); 
     // increment point index 
     ++mLastPointIndex; 
     isPathStarted = false; 
    } 

} 
} 

MainActivity.java

public class MainActivity extends Activity { 

    TextView textView; 


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

     textView = (TextView)findViewById(R.id.marks_id); 
     //update(); 
    } 

    /*private void update() { 
     // TODO Auto-generated method stub 
     String newMarks = ""; 
     newMarks = Integer.toString(marks); 
     TextView textView = (TextView)findViewById(R.id.marks_id); 
     textView.setText(newMarks); 
    }*/ 



} 

我想從PaintView商標的價值。 java並將該值分配給MainActivity.java中的textView。它是一種noob問題,但請幫助我。

+0

看到這個帖子,幫助您更從非UI類訪問的TextView http://stackoverflow.com/questions/6030982/android-how-to-access-activity-ui-from-my -class –

+0

請將您發佈的代碼量減少到展示您的問題所需的最低限度。 –

+1

很可能你應該爲''PaintView''添加一個''MarksObserver''接口和''setMarksObserver''方法。然後在''MainActivity''中實現''MarksObserver''並將其添加到''PaintView''。在這些變更之後,一旦標記值被修改,你就有辦法從''PaintView''通知觀察者。 – harism

回答

2

可以使用觀察者模式來做到這一點,

ObserverActivity.java

這是你的觀測有超過一個觀察者

public class ObserverActivity extends Activity implements Observer{ 
    com.talha.examples.PaintView paint1; 
    private ActivityHolder paintHolder = ActivityHolder.getInstance(); 
    EditText editText1; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_paintview);   
     paint1= (com.talha.examples.PaintView)findViewById(R.id.paint1); 
     editText1= (EditText)findViewById(R.id.editText1); 
     paintHolder.registerObserver(this); 

    } 

    @Override 
    public void updateNewValue(String str) {   
     editText1.setText(str); 
    } 
} 

Observer.java 你所有觀察員必須執行此操作

public interface Observer { 
    public void updateNewValue(String str); 
} 

Subject.java

public interface Subject { 
    public void registerObserver(Observer o); 
    public void removeObserver(Observer o); 
    public void notifyObserver(); 
} 

ActivityHolder.java

本課程將使用單列表中持有的觀察者,那麼你可以調用所有的觀察者通知數據已經改變

import java.util.ArrayList; 

public class ActivityHolder implements Subject { 
    private static ActivityHolder uniqueActivityHolder; 
    private ArrayList observers; 
    private String newValue; 

    private ActivityHolder() { 
     observers = new ArrayList(); 
    } 

    public static synchronized ActivityHolder getInstance() { 
     if (uniqueActivityHolder == null) { 
      uniqueActivityHolder = new ActivityHolder(); 
     } 
     return uniqueActivityHolder; 
    } 

    public void registerObserver(Observer o) { 
     observers.add(o); 
    } 

    public void removeObserver(Observer o) { 
     int i = observers.indexOf(o); 
     if (i >= 0) { 
      observers.remove(i); 
     } 

    } 

    public void notifyObserver() { 
     for (int i = 0; i < observers.size(); i++) { 
      Observer observer = (Observer) observers.get(i); 
      observer.updateNewValue(newValue); 
     } 
    } 

    public void valueChanged() { 
     notifyObserver(); 
    } 

    public void setNewValue(String _NewValue) { 
     this.newValue = _NewValue; 
     valueChanged(); 
    } 
} 

PaintView.java

油漆視圖數據獲取ActivityHolder唯一實例,其保持觀察者列表中,那麼它會通知下面代碼

所有觀察員(INT I = 0;我< observers.size();觀察者觀察者=(觀察者)observers.get(i); observer.updateNewValue(newValue); }

import java.util.ArrayList; 
import java.util.List; 
import android.content.Context; 
import android.content.res.Resources; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.Point; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.util.TypedValue; 
import android.view.MotionEvent; 
import android.view.View; 

public class PaintView extends View{ 

    private Bitmap mBitmap; 
    private Canvas mCanvas; 
    private Path mPath; 
    private Paint mPaint; 
    private static final int TOUCH_TOLERANCE_DP = 20; 
    private static final int BACKGROUND = 0xFFDDDDDD; 
    private List<Point> mPoints = new ArrayList<Point>(); 
    private int mLastPointIndex = 0; 
    private int marks = 0; 
    private int mTouchTolerance; 
    private boolean isPathStarted = false; 
    private ActivityHolder paintHolder = ActivityHolder.getInstance(); 


    public PaintView(Context context) { 
     super(context); 
     mCanvas = new Canvas(); 
     mPath = new Path(); 
     mPaint = new Paint(); 
     mPaint.setAntiAlias(true); 
     mPaint.setDither(true); 
     mPaint.setColor(Color.BLACK); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(12); 
     mTouchTolerance = dp2px(TOUCH_TOLERANCE_DP);   

     // TODO just test points 
     Point p1 = new Point(133, 123); 
     Point p2 = new Point(149, 136); 
     Point p3 = new Point(182, 137); 
     Point p4 = new Point(206, 118); 
     Point p5 = new Point(208, 87); 
     Point p6 = new Point(187, 71); 
     Point p7 = new Point(144, 78); 
     Point p8 = new Point(124, 101); 
     Point p9 = new Point(113, 128); 
     Point p10 = new Point(112, 157); 
     Point p11 = new Point(119, 188); 
     Point p12 = new Point(134, 209); 
     Point p13 = new Point(162, 228); 
     Point p14 = new Point(194, 238); 
     Point p15 = new Point(232, 240); 
     Point p16 = new Point(263, 237); 
     Point p17 = new Point(289, 224); 
     Point p18 = new Point(315, 204); 
     Point p19 = new Point(332, 174); 
     Point p20 = new Point(339, 128); 
     Point p21 = new Point(329, 95); 
     Point p22 = new Point(304, 73); 
     Point p23 = new Point(280, 69); 
     Point p24 = new Point(254, 87); 
     Point p25 = new Point(248, 116); 
     Point p26 = new Point(259, 143); 
     Point p27 = new Point(278, 153); 
     Point p28 = new Point(241, 157); 
     Point p29 = new Point(192, 160); 
     Point p30 = new Point(150, 159); 
     mPoints.add(p1); 
     mPoints.add(p2); 
     mPoints.add(p3); 
     mPoints.add(p4); 
     mPoints.add(p5); 
     mPoints.add(p6); 
     mPoints.add(p7); 
     mPoints.add(p8); 
     mPoints.add(p9); 
     mPoints.add(p10); 
     mPoints.add(p11); 
     mPoints.add(p12); 
     mPoints.add(p13); 
     mPoints.add(p14); 
     mPoints.add(p15); 
     mPoints.add(p16); 
     mPoints.add(p17); 
     mPoints.add(p18); 
     mPoints.add(p19); 
     mPoints.add(p20); 
     mPoints.add(p21); 
     mPoints.add(p22); 
     mPoints.add(p23); 
     mPoints.add(p24); 
     mPoints.add(p25); 
     mPoints.add(p26); 
     mPoints.add(p27); 
     mPoints.add(p28); 
     mPoints.add(p29); 
     mPoints.add(p30); 
    } 

    public PaintView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mCanvas = new Canvas(); 
     mPath = new Path(); 
     mPaint = new Paint(); 
     mPaint.setAntiAlias(true); 
     mPaint.setDither(true); 
     mPaint.setColor(Color.BLACK); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(12); 
     mTouchTolerance = dp2px(TOUCH_TOLERANCE_DP); 

     // TODO just test points 
     Point p1 = new Point(133, 123); 
     Point p2 = new Point(149, 136); 
     Point p3 = new Point(182, 137); 
     Point p4 = new Point(206, 118); 
     Point p5 = new Point(208, 87); 
     Point p6 = new Point(187, 71); 
     Point p7 = new Point(144, 78); 
     Point p8 = new Point(124, 101); 
     Point p9 = new Point(113, 128); 
     Point p10 = new Point(112, 157); 
     Point p11 = new Point(119, 188); 
     Point p12 = new Point(134, 209); 
     Point p13 = new Point(162, 228); 
     Point p14 = new Point(194, 238); 
     Point p15 = new Point(232, 240); 
     Point p16 = new Point(263, 237); 
     Point p17 = new Point(289, 224); 
     Point p18 = new Point(315, 204); 
     Point p19 = new Point(332, 174); 
     Point p20 = new Point(339, 128); 
     Point p21 = new Point(329, 95); 
     Point p22 = new Point(304, 73); 
     Point p23 = new Point(280, 69); 
     Point p24 = new Point(254, 87); 
     Point p25 = new Point(248, 116); 
     Point p26 = new Point(259, 143); 
     Point p27 = new Point(278, 153); 
     Point p28 = new Point(241, 157); 
     Point p29 = new Point(192, 160); 
     Point p30 = new Point(150, 159); 
     mPoints.add(p1); 
     mPoints.add(p2); 
     mPoints.add(p3); 
     mPoints.add(p4); 
     mPoints.add(p5); 
     mPoints.add(p6); 
     mPoints.add(p7); 
     mPoints.add(p8); 
     mPoints.add(p9); 
     mPoints.add(p10); 
     mPoints.add(p11); 
     mPoints.add(p12); 
     mPoints.add(p13); 
     mPoints.add(p14); 
     mPoints.add(p15); 
     mPoints.add(p16); 
     mPoints.add(p17); 
     mPoints.add(p18); 
     mPoints.add(p19); 
     mPoints.add(p20); 
     mPoints.add(p21); 
     mPoints.add(p22); 
     mPoints.add(p23); 
     mPoints.add(p24); 
     mPoints.add(p25); 
     mPoints.add(p26); 
     mPoints.add(p27); 
     mPoints.add(p28); 
     mPoints.add(p29); 
     mPoints.add(p30); 
    } 

    public PaintView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     mCanvas = new Canvas(); 
     mPath = new Path(); 
     mPaint = new Paint(); 
     mPaint.setAntiAlias(true); 
     mPaint.setDither(true); 
     mPaint.setColor(Color.BLACK); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(12); 
     mTouchTolerance = dp2px(TOUCH_TOLERANCE_DP); 
    } 

    protected void onSizeChanged(int width, int height, int oldWidth, 
      int oldHeight) { 
     super.onSizeChanged(width, height, oldWidth, oldHeight); 
     clear(); 

    } 

    protected void onDraw(Canvas canvas) { 
     canvas.drawColor(BACKGROUND); 
     canvas.drawBitmap(mBitmap, 0, 0, null); 
     canvas.drawPath(mPath, mPaint); 

     // TODO remove if you dont want points to be drawn 
     for (Point point : mPoints) { 
      canvas.drawPoint(point.x, point.y, mPaint); 
     } 
    } 

    public boolean onTouchEvent(MotionEvent event) { 
     float x = event.getX(); 
     float y = event.getY(); 

     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      touch_start(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touch_move(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_UP: 
      touch_up(x, y); 
      invalidate(); 
      break; 
     } 
     return true; 
    } 

    private void touch_start(float x, float y) { 

     if (checkPoint(x, y, mLastPointIndex)) { 
      mPath.reset(); 
      // user starts from given point so path can beis started 
      isPathStarted = true; 
     } else { 
      // user starts move from point which doen's belongs to mPinst list 
      isPathStarted = false; 
     } 

    } 

    // ADDED WITH LAST EDIT 
    private void touch_move(float x, float y) { 
     // draw line with finger move 
     if (isPathStarted) { 
      mPath.reset(); 
      Point p = mPoints.get(mLastPointIndex); 
      mPath.moveTo(p.x, p.y); 
      if (checkPoint(x, y, mLastPointIndex + 1)) { 
       p = mPoints.get(mLastPointIndex + 1); 
       mPath.lineTo(p.x, p.y); 
       mCanvas.drawPath(mPath, mPaint); 
       mPath.reset(); 
       ++mLastPointIndex; 
       marks++; 
       update(); 
      } else { 
       mPath.lineTo(x, y); 
      } 
     } 
    } 

    private void update() { 
     // TODO Auto-generated method stub 
     String newMarks = ""; 
    newMarks = Integer.toString(marks); 

      // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
      // when you set the new value all your observers will be notified 
      // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

     paintHolder.setNewValue(newMarks); 

      // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
      // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
      // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 


     Log.e("Marks", ":" + newMarks); 
    } 

    /** 
    * Draws line. 
    */ 
    private void touch_up(float x, float y) { 
     mPath.reset(); 
     marks--; 
     update(); 
     if (checkPoint(x, y, mLastPointIndex + 1) && isPathStarted) { 
      // move finished at valid point so draw whole line 

      // start point 
      Point p = mPoints.get(mLastPointIndex); 
      mPath.moveTo(p.x, p.y); 
      // end point 
      p = mPoints.get(mLastPointIndex + 1); 
      mPath.lineTo(p.x, p.y); 
      mCanvas.drawPath(mPath, mPaint); 
      mPath.reset(); 
      // increment point index 
      ++mLastPointIndex; 
      isPathStarted = false; 
     } 

    } 

    /** 
    * Sets paint 
    * 
    * @param paint 
    */ 
    public void setPaint(Paint paint) { 
     this.mPaint = paint; 
    } 

    /** 
    * Returns image as bitmap 
    * 
    * @return 
    */ 
    public Bitmap getBitmap() { 
     return mBitmap; 
    } 

    /** 
    * Clears canvas 
    */ 
    public void clear() { 
     mBitmap = Bitmap.createBitmap(getWidth(), getHeight(), 
       Bitmap.Config.ARGB_8888); 
     mBitmap.eraseColor(BACKGROUND); 
     mCanvas.setBitmap(mBitmap); 
     invalidate(); 
    } 

    /** 
    * Checks if user touch point with some tolerance 
    */ 
    private boolean checkPoint(float x, float y, int pointIndex) { 
     if (pointIndex == mPoints.size()) { 
      // out of bounds 
      return false; 
     } 
     Point point = mPoints.get(pointIndex); 
     if (x > (point.x - mTouchTolerance) && x < (point.x + mTouchTolerance)) { 
      if (y > (point.y - mTouchTolerance) 
        && y < (point.y + mTouchTolerance)) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public List<Point> getPoints() { 
     return mPoints; 
    } 

    public void setPoints(List<Point> points) { 
     this.mPoints = points; 
    } 

    private int dp2px(int dp) { 
     Resources r = getContext().getResources(); 
     float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, 
       r.getDisplayMetrics()); 
     return (int) px; 
    } 


} 
+0

這真是太棒了...非常感謝...非常感謝。 –

+0

:)歡迎您 – Talha

+0

可以請您回答這個問題:http://stackoverflow.com/questions/13988010/how-to-change-position-of-point-as-per-screen-resolution/ –

相關問題