@Victorius

Как программно обновить ImageView?

Привет!
Я хочу сделать приложение, которое бы отображало определенные значения, как Вольтметр/Амперметр/Спидометр - т.е. чтобы стрелка ходила по шкале при изменении значения.
Я решил, что буду использовать ImageView и рисовать на canvas линии.
Но когда я делаю отрисовку на canvas, после этого myImageView.invalidate();
На дисплее отображается только стрелка в последней позиции, нет плавного перемещения/отрисовки стрелки.
public class TesteRotateActivity extends Activity implements SensorEventListener {

private MyImageView myImageView;
private SensorManager mSensorManager;
private int widthIV=120,heightIV=100;
private Sensor sensor;
private Bitmap bitmap = Bitmap.createBitmap(widthIV,heightIV,Bitmap.Config.ARGB_8888);
private Bitmap b2=Bitmap.createBitmap(widthIV,heightIV,Bitmap.Config.ARGB_8888);
private int m,a=(int)widthIV/2,b=(int)heightIV/2;
private Canvas canvas;
private TextView t;
private Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
private double prev = 0;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
    sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
    myImageView = (MyImageView) findViewById(R.id.imageview);
    t = (TextView)findViewById(R.id.textview);
    ImageView i2 = (ImageView)findViewById(R.id.i2);
    Button b = (Button)findViewById(R.id.button1);
    b.setOnClickListener(new View.OnClickListener() {
		
		@Override
		public void onClick(View arg0) {
			globalDraw(50);
		}
	});
}
	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {
	}

	@Override
	public void onSensorChanged(SensorEvent event) {	
	}
	protected void onResume(){
		super.onResume();
		mSensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
	}
	protected void onPause(){
		super.onPause();
		mSensorManager.unregisterListener(this);
	}
	
	private void drawArraw(double t){
		bitmap=b2.copy(Bitmap.Config.ARGB_8888, true);
		canvas = new Canvas(bitmap);
		p.setColor(Color.DKGRAY);
		p.setStrokeWidth(2f);
	    myImageView.setImageBitmap(bitmap);	    
		int x=(int) (a*Math.cos(t))+a;
		int y=(int) (b*Math.sin(t))+b;
		canvas.drawLine(a,b,x, y, p);
		myImageView.setImageDrawable(new BitmapDrawable(getResources(),bitmap));
		myImageView.invalidate();
	}
	public void globalDraw(double valueOfMeter){
		Integer in = (new Double(valueOfMeter)).intValue();
	    m=1;
	    for(int k =0;k<in.toString().toCharArray().length-2;k++)
	    	m*=10;
		double diff = prev-valueOfMeter;
		if(diff<0)
			for(double i=diff;i<=0;i++){
				double value = (valueOfMeter+i)/m*1.8+180;
				value=value*Math.PI/180;
				drawArraw(value);
			}
		else
			for(double i=0;i<diff;i++){
				double value = (prev-i)/m*1.8+180;
				value=value*Math.PI/180;
				drawArraw(value);
			}
	}
}

Как мне отображать динамично изменения ImageView или какой инструмент использовать для достижения той же цели.
  • Вопрос задан
  • 3679 просмотров
Решения вопроса 1
@Victorius Автор вопроса
Необходимо было создавать свое View, переписывать onDraw. Яркий пример для реализации спидометра или чего-то подобного - GaugeView
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Moxa
используйте SurfaceView и будет Вам счастье)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы