R.id.imgFp sehe ich nirgends.
Sicher, dass Du nicht R.id.imageView1 meinst?
Stimmt, jedoch war es hier lediglich ein Einfügefehler. Hab es bei mir immer mit imageView1 laufen lassen.
R.id.imgFp sehe ich nirgends.
Sicher, dass Du nicht R.id.imageView1 meinst?
Stimmt, jedoch war es hier lediglich ein Einfügefehler. Hab es bei mir immer mit imageView1 laufen lassen.
Guten Abend
Hab da ein kleines Problem beim Ändern der ImageView-Resource. Ich habe nur eine Activity-Klasse und eine Custom View-Klasse. Im Custom View wird via OnTouchEvent die Berührung gehanhabt und dann in den Hilfsklassen der Custom View Klasse weiter verarbeitet. Diese Lauten FlaechenAuswahl und ImageChanger. Nun möchte ich im ImageChanger das Bild , je nach Berührungsort des CustomView, ändern. Jedoch bring ich das einfach nicht hin, momentan gibt es zwar keinen Fehler mehr aus, das Bild ändert sich trotzdem nicht...
Zur besseren Übersicht nehme ich alle bisherigen Versuche raus und lasse meine Hauptüberlegung einfach drin, damit es etwas übersichtlicher wird. Bei dieser Variante wird die 2. If-Bedigung in der Changer-Methode nicht eintreten, da das imgV = null ist.(Ohne die 2. Bedigung gäbe es eine FATAL EXCEPTION: main java.lang.NullPointerException).
Daraus lässt sich schliessen, dass nicht richtig auf das ImageView Objekt zugegriffen wurde. Könnte dies mit dem Context im Zusammenhang liegen?
Besten Dank
public class ImageChanger extends FlaechenAuswahl {
static String getImName;
static LayoutInflater controlInflater;
static int getID;
static int counter = 0;
View view;
static ImageView imgV;
static Context blub;
public ImageChanger(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void getImageId(String name) {
getID = getResources().getIdentifier(name, "drawable", "com.test1.jassteppich.jasstepich20");
}
public void getImageName(){
if (counter == 0) {
getImName = "leerelinien";
counter++;
}
else if (counter == 1) {
getImName = "linie1";
counter++;
}
else if (counter == 2) {
getImName = "linien2";
counter++;
}
else if (counter == 3) {
getImName = "linien3";
counter++;
}
else if (counter == 4) {
getImName = "linien4";
counter++;
}
else if (counter == 5) {
getImName = "linien5";
}
}
public void Change(){
getImageName();
getImageId(getImName);
Log.d("", "Context lautet "+getContext());
//Der Nachfolgende Code ist einfach meine Anfangs-und Hauptüberlegung
imgV = (ImageView) findViewById(R.id.imageView1);
if(getID != 0){
Log.d("", "Vor dem Wechsel angekommen ");
if(imgV != null) {
Log.d("","imgV ist nicht null");
Log.d("", "getID ist gleich "+getID);
Log.d("", "Bild mit namen "+getImName);
Log.d("","Context lautet"+layout.getContext());
imgV.setImageResource(getID);
}else {
}}
else{
Log.d("", "Change ");
}
}
}
Alles anzeigen
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/num1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/tafelrichtig2"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/layout2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true" >
<com.test1.jassteppich.jasstepich20.BeruehrungOben
android:id="@+id/oben"
android:layout_width="wrap_content"
android:layout_height="576dp" />
</LinearLayout>
<LinearLayout
android:layout_marginTop="10dp"
android:id="@+id/layout1" android:layout_width="96dp" android:layout_height="191.5dp" android:layout_marginLeft="70dp" android:layout_alignTop="@+id/layout2">
<ImageView
android:id="@+id/imageView1"
android:layout_width="96dp"
android:layout_height="191.5dp"
android:contentDescription="hunderter"
android:scaleType="fitXY"
/>
</LinearLayout>
</RelativeLayout>
Alles anzeigen
Hallo Zusammen
Ich habe ein kleines Problem.
Ich habe eine onClick Methode, in dieser wird eine Variable bei jedem Klick um 1 erhöht. Diese Variable soll nun in eine anderen Klasse in einem TextView dargestellt werden.
In dieser 2. Klasse gibt es einen Button refresh, bei dem der Wert der im Textfeld angezeigt werden soll aktualisiert wird.
Ich habe das eigentliche Problem gefunden! Das Problem ist nicht der Zugriff sondern das Aktualisieren der Anzeige, nachdem der Button geklickt wurde, wird zwar die Variable aktualisiert aber der Bildschirm nicht!
Variable bereitstellen:
Variable um eins erhöhen:
2. Klasse
Beim Klick auf den Button auf den Wert zugreiffen...
Joah bisschen, trotzdem danke für die Antwort mal schauen was mir besser geht..:)
Hab hier meinen Code, einmal die Main Activity und das andere Mal meine View Klasse. Ich übergebe den Wert "counter" vom View an meine Activity, dies kein Problem. "count" ändert sich ständig im View, in meiner Main Activity wird aber nur der Anfangswert den "count" bei der ersten Übergabe hatte übernommen, in diesem Falle 1. Meine Frage ist nun warum es diesen Wert nicht aktualisiert, denn nach jeder Touch-Berührung wird count um 1 grösser, also sollte auch der übergebene Wert um 1 grösser werden..
MainActivity:
package com.example.drawproject;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.os.Build;
public class MainActivity extends Activity {
Button b1; //Gelb
Button b2; //Blau
Button b3; //Grün
Integer Pcount2 = DrawArea.getCountValue(); //get the count value
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.drawlayout);
DrawArea da = new DrawArea(this, null);
if(Pcount2 % 2 ==0){ //use it -> it's always the same number, instead of the increased
Intent nextScreen = new Intent(this, ChangeArea.class);
startActivity(nextScreen);
}
else{
Pcount2++;
}
}
}
Alles anzeigen
View Klasse
package com.example.drawproject;
import android.content.Context;
import android.graphics.*;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.view.MotionEvent;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class DrawArea extends View {
private List<Stroke> _allStrokes; //all strokes that need to be drawn
private SparseArray<Stroke> _activeStrokes; //use to retrieve the currently drawn strokes
private Random _rdmColor = new Random();
static int count = 1; // count ist 1
public DrawArea(Context context, AttributeSet attrs) {
super(context, attrs);
_allStrokes = new ArrayList<Stroke>();
_activeStrokes = new SparseArray<Stroke>();
setFocusable(true);
setFocusableInTouchMode(true);
}
public void onDraw(Canvas canvas) {
if (_allStrokes != null) {
for (Stroke stroke: _allStrokes) {
if (stroke != null) {
Path path = stroke.getPath();
Paint painter = stroke.getPaint();
if ((path != null) && (painter != null)) {
if(count%2 != 0){
canvas.drawPath(path, painter);
}
}
}
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
final int action = event.getActionMasked();
final int pointerCount = event.getPointerCount();
switch (action) {
case MotionEvent.ACTION_DOWN: {
count++; // count wird um 1 erhöht
if(count%2 != 1)
{pointDown((int)event.getX(), (int)event.getY(), event.getPointerId(0));
break;
}
if (count%2 != 0){
for (int pc = 0; pc < pointerCount; pc++) {
pointDown((int)event.getX(pc), (int)event.getY(pc), event.getPointerId(pc));
}
}
}
case MotionEvent.ACTION_MOVE: {
break;
}
case MotionEvent.ACTION_UP: {
break;
}
}
invalidate();
return true;
}
public static int getCountValue(){
int count2 = count; //count wird zur übergabe vorbereitet...
return count2;
}
private void pointDown(int x, int y, int id) {
Integer value = ChangeArea.getColorValue();
if(count%2 !=1){
//create a paint with random color
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
if (value == 1){
paint.setStrokeWidth(15);
}else
if (value == 2){
paint.setStrokeWidth(20);
}else
if (value == 3){
paint.setStrokeWidth(5);
}
else{
paint.setStrokeWidth(10);
}
if (value == 1){
paint.setColor(Color.YELLOW);
}else
if (value == 2){
paint.setColor(Color.BLUE);
}else
if (value == 3){
paint.setColor(Color.GREEN);
}
else{
paint.setColor(_rdmColor.nextInt()); //Here should the values be added!
}
//create the Stroke
Point pt = new Point(x, y);
Stroke stroke = new Stroke(paint);
stroke.addPoint(pt);
_activeStrokes.put(id, stroke);
_allStrokes.add(stroke);
}
if (count%2 != 0){
//retrieve the stroke and add new point to its path
Stroke stroke = _activeStrokes.get(id);
if (stroke != null) {
Point pt = new Point(x, y);
stroke.addPoint(pt);
}
}
}
}
Alles anzeigen
Also grundsätzlich macht man es so:
In der Klasse in der man den Wert hat, braucht man diesen Code: "Wert" ist der Wert den man weiter geben möchte:
In der anderen Klasse kann man es dann so abrufen:
Fragen?
Hab die Antwort schon bekommen!
~closed~
Hallo Zusammen
Ich habe hier meinen Code der Linien macht in zufälligen Farben. Nun hab ich 3 Buttons zum Layout hinzugefügt welche einen jeweiligen Wert besitzen, Button1 = 1, 2 =2 und 3 = 3, nun muss ich diese Werte in meiner View - Klasse aufrufen können und benutzen können um dort die Farbe zu verändern.
Ich habe bereits etwas mit getter und setter, sowohl intents probiert, bin bis anhin aber erfolglos geblieben...
Wäre um Hilfe dankbar!
Hauptklasse
package com.example.drawproject;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.os.Build;
public class MainActivity extends Activity {
Button b1; //Gelb
Button b2; //Blau
Button b3; //Grün
public int value = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.drawlayout);
DrawArea da = new DrawArea(this, null);
b1 = (Button) findViewById(R.id.button1);
b1.setOnClickListener(handler);
b2 = (Button) findViewById(R.id.button2);
b2.setOnClickListener(handler);
b3 = (Button) findViewById(R.id.button3);
b3.setOnClickListener(handler);
}
View.OnClickListener handler = new View.OnClickListener(){
public void onClick(View v){
if(v==b1){
value = 1;
}
if(v==b2){
value = 2;
}
if(v==b3){
value = 3;
}
}};
}
Alles anzeigen
HauptLayout
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.example.drawproject.DrawArea android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/button1" /><Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="84dp" android:layout_marginTop="79dp" android:text="Yellow" /><Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/button1" android:layout_alignBottom="@+id/button1" android:layout_marginLeft="165dp" android:layout_toRightOf="@+id/button1" android:text="Blue" /><Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/button2" android:layout_alignParentRight="true" android:layout_marginRight="134dp" android:text="Green" /></RelativeLayout>
View Klasse
package com.example.drawproject;import android.content.Context;import android.graphics.*;import android.util.AttributeSet;import android.util.SparseArray;import android.view.MotionEvent;import android.view.View;import java.util.ArrayList;import java.util.List;import java.util.Random;public class DrawArea extends View {private List<Stroke> _allStrokes; //all strokes that need to be drawnprivate SparseArray<Stroke> _activeStrokes; //use to retrieve the currently drawn strokesprivate Random _rdmColor = new Random();int count = 1;public DrawArea(Context context, AttributeSet attrs) { super(context, attrs); _allStrokes = new ArrayList<Stroke>(); _activeStrokes = new SparseArray<Stroke>(); setFocusable(true); setFocusableInTouchMode(true);}public void onDraw(Canvas canvas) { if (_allStrokes != null) { for (Stroke stroke: _allStrokes) { if (stroke != null) { Path path = stroke.getPath(); Paint painter = stroke.getPaint(); if ((path != null) && (painter != null)) { if(count%2 != 0){ canvas.drawPath(path, painter); } } } } }}@Overridepublic boolean onTouchEvent(MotionEvent event) { final int action = event.getActionMasked(); final int pointerCount = event.getPointerCount(); switch (action) { case MotionEvent.ACTION_DOWN: { count++; if(count%2 != 1) {pointDown((int)event.getX(), (int)event.getY(), event.getPointerId(0)); break; } if (count%2 != 0){ for (int pc = 0; pc < pointerCount; pc++) { pointDown((int)event.getX(pc), (int)event.getY(pc), event.getPointerId(pc)); } } } case MotionEvent.ACTION_MOVE: { break; } case MotionEvent.ACTION_UP: { break; } } invalidate(); return true;}private void pointDown(int x, int y, int id) { if(count%2 !=1){ //create a paint with random color Paint paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(10); paint.setColor(_rdmColor.nextInt()); //Here should the values be added! //create the Stroke Point pt = new Point(x, y); Stroke stroke = new Stroke(paint); stroke.addPoint(pt); _activeStrokes.put(id, stroke); _allStrokes.add(stroke); } if (count%2 != 0){ //retrieve the stroke and add new point to its path Stroke stroke = _activeStrokes.get(id); if (stroke != null) { Point pt = new Point(x, y); stroke.addPoint(pt); } }}}
Zusatz View Klasse
package com.example.drawproject;import android.graphics.Paint;import android.graphics.Path;import android.graphics.Point;public class Stroke { private Path _path; private Paint _paint; public Stroke (Paint paint) { _paint = paint; } public Path getPath() { return _path; } public Paint getPaint() { return _paint; } public void addPoint(Point pt) { if (_path == null) { _path = new Path(); _path.moveTo(pt.x, pt.y); } else { _path.lineTo(pt.x, pt.y); } }}
Ich hab nur das Problem gehbat, dass es mir die funktion der View, das Zeichnen nicht angezeigt, hatte, hab das so eingefügt!
<com.example.volleyballapp.ViewFeld
android:id="@+id/linienView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignTop="@+id/view2"
/>
Die Lösung war, dass ich es am End meines Layouts einfügen musste, ich wollte nix vorgekaut bekommen, dachte nur, dass ich einen Fehler gemacht habe im Code ;))
Hallo Leute
Ich bins schon wieder^^, diesmal mit der Frage wie ich meine View Klasse in meiner Activity aufrufen kann. Ich habe eine Activity die beim drücken des Knopfes: Neues Feld aufgerufen wird, diese Activity wird dann geöffnet und beinhaltet das Layout: Feldlayout. Nun hab ich eine View-kLasse: ViewFeld die in der FeldLayout-Activity geöffnet werden soll, um benutzt zu werden.
Kann mir jemand sagen wie ich das machen kann oder mir einen Tipp geben was ich dafür benötige?
Feldlayout.class
package com.example.volleyballapp;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
public class feldlayout extends Activity{
Button b7;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.feldlayout);
b7 = (Button) findViewById(R.id.button7);
b7.setOnClickListener(handler);
}
View.OnClickListener handler = new View.OnClickListener(){
public void onClick(View v) {
if(v==b7){
Intent i = new Intent(feldlayout.this, Main_Layout.class);
startActivity(i);
}
}};}
Alles anzeigen
Feldlayout.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/farbe" android:orientation="vertical" > <ImageView android:id="@+id/view2" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="70dp" android:layout_marginLeft="70dp" android:layout_marginRight="70dp" android:layout_marginTop="160dp" android:background="@drawable/whiterectangle" /> <ImageView android:id="@+id/view1" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="74dp" android:layout_marginLeft="74dp" android:layout_marginRight="74dp" android:layout_marginTop="164dp" android:background="@drawable/volleyballfeld" /> <ImageView android:id="@+id/view3meterlinie" android:layout_width="match_parent" android:layout_height="4dp" android:layout_alignTop="@+id/view1" android:layout_marginLeft="70dp" android:layout_marginRight="70dp" android:layout_marginTop="100dp" android:background="@drawable/dreimeterlinie" /> <ImageView android:id="@+id/netz" android:layout_width="match_parent" android:layout_height="4dp" android:layout_alignTop="@+id/view1" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="310dp" android:background="@drawable/netz" /> <ImageView android:id="@+id/view3meterliniedef" android:layout_width="match_parent" android:layout_height="4dp" android:layout_alignTop="@+id/view1" android:layout_marginLeft="70dp" android:layout_marginRight="70dp" android:layout_marginTop="520dp" android:background="@drawable/dreimeterlinie" /> <Button android:id="@+id/button8" style="@style/HomeText" android:layout_width="140dp" android:layout_height="85dp" android:layout_alignParentTop="true" android:layout_alignRight="@+id/view1" android:layout_marginTop="1dp" android:background="@drawable/bnt_black" android:text="Speichern" /> <Button android:id="@+id/button7" style="@style/HomeText" android:layout_width="140dp" android:layout_height="85dp" android:layout_alignLeft="@+id/view2" android:layout_alignParentTop="true" android:layout_marginTop="1dp" android:background="@drawable/bnt_black" android:onClick="home" android:text="Zurück" /> <Button android:id="@+id/button9" style="@style/HomeText" android:layout_width="140dp" android:layout_height="85dp" android:layout_alignTop="@+id/button7" android:layout_marginLeft="35dp" android:layout_toRightOf="@+id/button7" android:background="@drawable/bnt_black" android:text="Linien Anzeigen" /> <Button android:id="@+id/Statistik" style="@style/HomeText" android:layout_width="140dp" android:layout_height="85dp" android:layout_alignBaseline="@+id/button8" android:layout_alignBottom="@+id/button8" android:layout_marginRight="31dp" android:layout_toLeftOf="@+id/button8" android:background="@drawable/bnt_black" android:text="Statistik" /> </RelativeLayout>
ViewFeld.class
package com.example.volleyballapp;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;public class ViewFeld extends View{ private Paint paint = new Paint(); private Path path = new Path(); int count = 1; public ViewFeld(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub paint.setAntiAlias(true); paint.setStrokeWidth(6f); //Breite des Strichs paint.setColor(Color.BLACK); //Farbe des Strichs paint.setStyle(Paint.Style.STROKE); paint.setStrokeJoin(Paint.Join.ROUND); } protected void onDraw(Canvas canvas) { if ((count%2 != 0)){ canvas.drawPath(path, paint);} } @Override public boolean onTouchEvent(MotionEvent event) { float eventX = event.getX(); float eventY = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: count++; if(count%2 != 1){ path.moveTo(eventX, eventY); return true; } if(count%2 != 0){ path.lineTo(eventX, eventY); break; } case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: // nothing to do break; default: return false; } // Schedules a repaint. invalidate(); return true; } }
Hey vielen Dank für deine Antwort.
Das tutorial kenne ich und dane, dass du mich nochmals darauf hngewiesen hast, werde heute mal das ganze mit Phaps probieren und dann am Abend meine Resultate posten.
mfg Aless
Hallo Zusammen
Ich bekomme vom onTouchEvent Punkte, immer nach 2 Punkten soll eine Linie gezogen werden, dies zwischen den nacheinander folgenden Punkten. Diese Linie sollte dann aber bestehen bleiben, das heisst, dass zwar eine neue hinzu kommt, die alte aber bestehen bleibt. Nun dies ist mein Problem. Ich kann zwar eine Linie machen, diese bleibt aber nicht bestehen!
Kann mir jemand erklären wie ich das hinkriege?
Edit: So funktioniert es nun, mit Paths klappt es perfekt! Hier ist der Code der funktioniert!
package com.example.linienmachen;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class Touchclass extends View {
private Paint paint = new Paint();
private Path path = new Path();
int count = 1;
public Touchclass(Context context, AttributeSet attrs) {
super(context, attrs);
paint.setAntiAlias(true);
paint.setStrokeWidth(6f);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
}
@Override
protected void onDraw(Canvas canvas) {
if ((count%2 != 0)){
canvas.drawPath(path, paint);}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float eventX = event.getX();
float eventY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
count++;
if(count%2 != 1){
path.moveTo(eventX, eventY);
return true;
}
if(count%2 != 0){
path.lineTo(eventX, eventY);
break;
}
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
// nothing to do
break;
default:
return false;
}
// Schedules a repaint.
invalidate();
return true;
}
}
Alles anzeigen