Программа градусник

Ответить
Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Программа градусник

Сообщение IgNa » 04 дек 2013, 11:39

Моя задача нарисовать вот это красный ртутный столбик на imageview используя Bitmap и Canvas

День без малого я потратил на поиски нужного когда и облегчился, но логи так и не смогли смириться
с моей маленькой победой. И я решил что пора вызывать подкрепление

КОД

Код: Выделить всё

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.widget.ImageView;

public class MainActivity extends Activity {

ImageView mImagenCampo = (ImageView) findViewById(R.id.imagen_campo); 
Bitmap bmp;
Canvas c;	
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	
	
		drawline(10, 10,10, 39,Color.RED);


	}
	private void drawline(int x, int y, int xend, int yend, int color) {

	    bmp = Bitmap.createBitmap(mImagenCampo.getWidth(), mImagenCampo.getHeight(), Config.ARGB_8888);
	    c = new Canvas(bmp);
	    mImagenCampo.draw(c);

	    Paint p = new Paint();
	    p.setColor(color);
	    c.drawLine(x, y, xend, yend, p);
	    mImagenCampo.setImageBitmap(bmp);
	}
	
}
Логи

Код: Выделить всё

12-04 12:38:46.951: D/AndroidRuntime(2231): Shutting down VM
12-04 12:38:46.951: W/dalvikvm(2231): threadid=1: thread exiting with uncaught exception (group=0x409de1f8)
12-04 12:38:47.001: E/AndroidRuntime(2231): FATAL EXCEPTION: main
12-04 12:38:47.001: E/AndroidRuntime(2231): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{cm.example.newdraw/cm.example.newdraw.MainActivity}: java.lang.NullPointerException
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1880)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at android.app.ActivityThread.access$600(ActivityThread.java:123)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at android.os.Handler.dispatchMessage(Handler.java:99)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at android.os.Looper.loop(Looper.java:137)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at android.app.ActivityThread.main(ActivityThread.java:4424)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at java.lang.reflect.Method.invokeNative(Native Method)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at java.lang.reflect.Method.invoke(Method.java:511)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at dalvik.system.NativeStart.main(Native Method)
12-04 12:38:47.001: E/AndroidRuntime(2231): Caused by: java.lang.NullPointerException
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at android.app.Activity.findViewById(Activity.java:1821)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at cm.example.newdraw.MainActivity.<init>(MainActivity.java:14)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at java.lang.Class.newInstanceImpl(Native Method)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at java.lang.Class.newInstance(Class.java:1319)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1871)
12-04 12:38:47.001: E/AndroidRuntime(2231): 	... 11 more
Изображение

WizikTLT
Сообщения: 52
Зарегистрирован: 01 ноя 2013, 13:30

Re: Программа градусник

Сообщение WizikTLT » 04 дек 2013, 11:49

mImagenCampo = (ImageView) findViewById(R.id.imagen_campo); нужно делать в onCreate после setContentView(R.layout.main); , а
заместо
"ImageView mImagenCampo = (ImageView) findViewById(R.id.imagen_campo);"
которое в начале кода у тебя
оставь так
ImageView mImagenCampo;

Это для начала =)

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Программа градусник

Сообщение IgNa » 04 дек 2013, 12:03

Так) делаем ставки, крутим барабан И ))...
Новые логи. Ширина и высота должны быть больше нуля, странно да ?

Код: Выделить всё

12-04 12:59:37.520: E/AndroidRuntime(2454): FATAL EXCEPTION: main
12-04 12:59:37.520: E/AndroidRuntime(2454): java.lang.RuntimeException: Unable to start activity ComponentInfo{cm.example.newdraw/cm.example.newdraw.MainActivity}: java.lang.IllegalArgumentException: width and height must be > 0
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at android.app.ActivityThread.access$600(ActivityThread.java:123)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at android.os.Handler.dispatchMessage(Handler.java:99)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at android.os.Looper.loop(Looper.java:137)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at android.app.ActivityThread.main(ActivityThread.java:4424)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at java.lang.reflect.Method.invokeNative(Native Method)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at java.lang.reflect.Method.invoke(Method.java:511)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at dalvik.system.NativeStart.main(Native Method)
12-04 12:59:37.520: E/AndroidRuntime(2454): Caused by: java.lang.IllegalArgumentException: width and height must be > 0
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at android.graphics.Bitmap.createBitmap(Bitmap.java:603)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at android.graphics.Bitmap.createBitmap(Bitmap.java:585)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at cm.example.newdraw.MainActivity.drawline(MainActivity.java:31)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at cm.example.newdraw.MainActivity.onCreate(MainActivity.java:25)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at android.app.Activity.performCreate(Activity.java:4492)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
12-04 12:59:37.520: E/AndroidRuntime(2454): 	... 11 more
Изображение

WizikTLT
Сообщения: 52
Зарегистрирован: 01 ноя 2013, 13:30

Re: Программа градусник

Сообщение WizikTLT » 04 дек 2013, 12:10

createBitmap(mImagenCampo.getWidth(), mImagenCampo.getHeight()
скорей всего тут проблема - первым и вторым параметром передай что-либо больше нуля. Просто цифрами передай

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Программа градусник

Сообщение IgNa » 04 дек 2013, 12:17

Ты представляешь что она мне за это сделала)
я ввел числа как ты посоветовал и тогда она взяла и начертила крохотную линию, а вот imageview исчез с активити.

Типа заявила - либо Линия, либо imageviev. Зла не хватает, такие они стервы - эти Канвачки))
Последний раз редактировалось IgNa 04 дек 2013, 12:20, всего редактировалось 1 раз.
Изображение

WizikTLT
Сообщения: 52
Зарегистрирован: 01 ноя 2013, 13:30

Re: Программа градусник

Сообщение WizikTLT » 04 дек 2013, 12:19

почему ты думаешь что ImageView пропала?
ты же в конце делаешь
mImagenCampo.setImageBitmap(bmp);
как раз твою линию и ставит в качестве рисунка в ImageView

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Программа градусник

Сообщение IgNa » 04 дек 2013, 12:25

а если это убрать mImagenCampo.setImageBitmap(bmp);
то и линию пропадает, и я вижу только свой imageview
это замкнутый круг :cry: :cry: :cry:
я хочу домой, к маме :cry:
Последний раз редактировалось IgNa 04 дек 2013, 12:30, всего редактировалось 1 раз.
Изображение

WizikTLT
Сообщения: 52
Зарегистрирован: 01 ноя 2013, 13:30

Re: Программа градусник

Сообщение WizikTLT » 04 дек 2013, 12:27

ну убирать mImagenCampo.setImageBitmap(bmp);
точно не надо)
я просто не до конца понял что ты хочешь там увидеть?

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Программа градусник

Сообщение IgNa » 04 дек 2013, 12:31

Я хочу увидеть красную линию на поверхности imageview, это реально ?
( Прямо на "фотографии" как бы )
Изображение

WizikTLT
Сообщения: 52
Зарегистрирован: 01 ноя 2013, 13:30

Re: Программа градусник

Сообщение WizikTLT » 04 дек 2013, 12:34

конечно =)
у тебя же почти получилось
drawline(10, 10,10, 39,Color.RED);
у тебя же сейчас уже есть линия - то что она маленькая это потому что ты передаешь
10, 10,10, 39 вот такие параметры
сделай
10, 10,10, 255
она будет длиннее.
и все это и так уже рисуется в твоем imageview


p.s фотку не вижу =(

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Программа градусник

Сообщение IgNa » 04 дек 2013, 12:40

ImageView mImagenCampo = (ImageView) findViewById(R.id.imagen_campo);
это и есть фотка,
линия должны быть на этой фотке, а не вместо неё, понимаешь ?
Изображение

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Программа градусник

Сообщение IgNa » 04 дек 2013, 12:43

<ImageView
android:id="@+id/imagen_campo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/abc" />
Изображение

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Программа градусник

Сообщение IgNa » 04 дек 2013, 12:47

А линии на пустом белом фоне я еще вчера чертил))
В том то и дело что нужна линия на существующем изображении

а потом это изображение будет перетаскиваться ( drag&drop) вместе с этой линией
Изображение

WizikTLT
Сообщения: 52
Зарегистрирован: 01 ноя 2013, 13:30

Re: Программа градусник

Сообщение WizikTLT » 04 дек 2013, 12:53

Bitmap bmp= BitmapFactory.decodeResource(getResources(), R.drawable.adc);
Canvas canvas = new Canvas(bitmap);
Paint p = new Paint();
p.setColor(Color.RED);
canvas.drawLine(x, y, xend, yend, p);
mImagenCampo.setImageBitmap(bmp);

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Программа градусник

Сообщение IgNa » 04 дек 2013, 13:07

По новой выкладываю весь код

Код: Выделить всё

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.widget.ImageView;

public class MainActivity extends Activity {

ImageView gradusnic; 
Bitmap bmp;
Canvas canvas;	
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	
		gradusnic = (ImageView) findViewById(R.id.imagen_campo); 
		drawline(10, 10,10,255,Color.RED);


	}
	
	private void drawline(int x, int y, int xend, int yend, int color) {
	    
	    Bitmap bmp= BitmapFactory.decodeResource(getResources(), R.drawable.abc);
	    Canvas canvas  = new Canvas(bmp);
	    Paint p = new Paint();
	    p.setColor(Color.RED);
	    p.setStrokeWidth(10);
	    canvas.drawLine(x, y, xend, yend, p);
	    gradusnic.setImageBitmap(bmp);
	    
	    
	    
	}
	
}

И логи

Код: Выделить всё

12-04 14:06:40.178: E/AndroidRuntime(3980): FATAL EXCEPTION: main
12-04 14:06:40.178: E/AndroidRuntime(3980): java.lang.RuntimeException: Unable to start activity ComponentInfo{cm.example.newdraw/cm.example.newdraw.MainActivity}: java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at android.app.ActivityThread.access$600(ActivityThread.java:123)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at android.os.Handler.dispatchMessage(Handler.java:99)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at android.os.Looper.loop(Looper.java:137)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at android.app.ActivityThread.main(ActivityThread.java:4424)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at java.lang.reflect.Method.invokeNative(Native Method)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at java.lang.reflect.Method.invoke(Method.java:511)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at dalvik.system.NativeStart.main(Native Method)
12-04 14:06:40.178: E/AndroidRuntime(3980): Caused by: java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at android.graphics.Canvas.<init>(Canvas.java:133)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at cm.example.newdraw.MainActivity.drawline(MainActivity.java:34)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at cm.example.newdraw.MainActivity.onCreate(MainActivity.java:26)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at android.app.Activity.performCreate(Activity.java:4492)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
12-04 14:06:40.178: E/AndroidRuntime(3980): 	... 11 more
Изображение

WizikTLT
Сообщения: 52
Зарегистрирован: 01 ноя 2013, 13:30

Re: Программа градусник

Сообщение WizikTLT » 04 дек 2013, 13:13

Bitmap bmp= BitmapFactory.decodeResource(getResources(), R.drawable.abc);
Bitmap copy = bmp.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(copy);
...
gradusnic.setImageBitmap(copy);
Хотя я чувствую что все это делается как-то гораздо проще)

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Программа градусник

Сообщение IgNa » 04 дек 2013, 13:23

WizikTLT, у меня слезы на глазах) получилось
два дня прошли не напрасно..
спасибо!!
додуматься, что надо перекодировать abc в битмап я и сам бы мог,
но вот до copy я бы никогда не додумался, благодарю
Изображение

WizikTLT
Сообщения: 52
Зарегистрирован: 01 ноя 2013, 13:30

Re: Программа градусник

Сообщение WizikTLT » 04 дек 2013, 13:26

А ведь достаточно было погуглить про Immutable bitmap =)

Ответить