- Tombol az AI-láz: az NVIDIA már értékesebb, mint az Apple
- Telekom otthoni szolgáltatások (TV, internet, telefon)
- Mozilla Firefox
- Felhő alapú adattárolás (Dropbox, stb.)
- Windows 11
- Proxmox VE
- SkyShowtime
- Tarr Kft. kábeltv, internet, telefon
- Linux - haladóknak
- Perelnek a vallásos kripto-piramisjáték miatt
Új hozzászólás Aktív témák
-
thon73
tag
válasz shinodas #636 üzenetére
Pl. így? Az ID-t is kiírja.
private final int MAX_POINTER=10;
private float[] posx=new float[MAX_POINTER];
private float[] posy=new float[MAX_POINTER];
private int[] id=new int[MAX_POINTER];
private int pointerCount = 0;
@Override
public boolean onTouchEvent(MotionEvent event)
{
switch (event.getActionMasked())
{
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
pointerCount = event.getPointerCount();
for (int cnt = 0; cnt < pointerCount && cnt <MAX_POINTER; cnt++)
{
posx[cnt] = event.getX(cnt);
posy[cnt] = event.getY(cnt);
id[cnt] = event.getPointerId(cnt);
}
this.invalidate();
break;
}
return true;
}
@Override
protected void onDraw(Canvas canvas)
{
for (int cnt = 0; cnt < pointerCount; cnt++)
{
canvas.drawText(Integer.toString(cnt) + ", [" + Integer.toString(id[cnt]) + "]", posx[cnt], posy[cnt]-80f, text);
canvas.drawCircle (posx[cnt], posy[cnt], 30f, paint);
}
}
}
}Nem vagyok benne biztos, hogy a getAction() action_POINTER_up kódot is visszaad. Ahhoz sztem. getActionMasked() lekérdezés kellene. De lehet, h. rosszul tudom. A fenti megoldás viszont akár tíz ujjal is működik. (Már ha a hardver tudja...)
[ Szerkesztve ]
-
thon73
tag
válasz shinodas #643 üzenetére
Két fontos dologra érdemes figyelni:
1. az onDraw minden invalidate után üres lappal indul. Ha meg akarod tartani az alakzatokat, akkor tárolni kell a koordinátáikat, és mindenannyiszor újrarajzolni őket. A gond az alakzatok "újra megfogásakor" jelentkezik: uis. honnét tudod, hogy egy már letett alakzatot kell mozgatnod, vagy egy újat? Legjobb lenne talán ellenőrizni, hogy az érintés vmelyik alakzat közelében van-e, és akkor azt hozzárendelni. De mindenképpen tárolni kell az adatokat.
2. nem az index számít, hanem az ID. Ez utóbbi ugyanis nem változik egy multitouch érintés során. Csak éppen nem sorban van, hanem végig kell nézni az indexeket és úgy kikeresni.
((És akkor még ott van a "historical" pontok sokasága, amivel nem foglalkoztunk.)) -
shinodas
tag
válasz shinodas #648 üzenetére
Az általad mutatott példában, mikor van a ciklus, ott hogyan tudom elkülöníteni a két pointerem értékét?
case MotionEvent.ACTION_MOVE:
pointerCount = event.getPointerCount();
for(cnt = 0; cnt<pointerCount && cnt<MAX_POINTER;cnt++)
{
posx[cnt] = event.getX(cnt);
posy[cnt] = event.getY(cnt);
id[cnt] = event.getPointerId(cnt);
mPosX = posx[cnt];
mPosY = posy[cnt];
}
this.invalidate();
break;Itt szeretnék mPosX2, és mPosY2-nek is értéket adni, de nem tudom, azt a pointert, hogyan kezeljem le.
[ Szerkesztve ]
-
thon73
tag
válasz shinodas #649 üzenetére
Ez csak egy bemutató-példa. Mi lenne a cél? Ha két fix alakzatot akarsz mozgatni, akkor azok koordinátáit kell külön tárolni, és egy-egy érintésnél legfeljebb a megfelelő ID-jű érintéshez rendelni.
Egy touchEvent az tényleg egyetlen érintés(sorozatot) ír le. Az ID arra szolgál, hogy EZEN BELÜL egy-egy ujjat kövessen akkor is, ha a többit felemeled (az index uis. csak felsorolja az aktuálisan hozzáérő pontokat, de a sorszám itt változhat.) Az már a Te programod feladata, hogy az alakzatok (és mozgásuk) valamint az érintések közötti logikát megalkossa. A bemutató csak minden mozdulatnál új alakzatokat rajzol az érintési pontokra, nem "gondoskodik" az alakzatokról, ezért is tűnnek el. -
thon73
tag
válasz shinodas #653 üzenetére
?? Ez azt jelenti, hogy a körök nem mozdíthatóak teljesen szabadon? Vagyis pl. nem keresztezhetik egymást? Mindkettőnek van egy saját területe? Mert akkor jobb lenne egy külön View-t alkotni egy körrel a közepén, amiben a kör - mint egy thumbstick mozgatható. Ha hozzáérsz valahol, akkor arra elmozdul a kör. Ha elengeded, akkor visszaúszik középre. Ez lenne a terv?
-
thon73
tag
válasz shinodas #655 üzenetére
Én lényegesen leegyszerűsíteném ezt a problémát. Készítenék egy speciális View-t, mely egy ilyen joystick-et mutat be. Ebből aztán kettő is elhelyezhető egy layoutban.
A joystick mindig középen áll. Ha megérintem valahol máshol a View-t (vagy a View belül egy kört is kijelölhetek erre), akkor a joystick/kör oda ugrik (és persze ezt az értéket kérdezhetem le). Ha elengedem, akkor visszaugrik középre.
Ez persze nem túl szép, mert a joysticknem ugrál, hanem szépen mozog. Ennek a szimulálására viszont el kell indítani a háttérszálon egy "ütem-adót", ami időnként jelzi a View-nak, hogy mozdítania kell egy kicsit a joystickon. Így úszhat a kör az érintés felé, vagy elengedésnél vissza középre. Az ütemadó nélkül nincs olyan esemény, ami a kör mozgását kiváltaná.
A másik lehetőség, hogy a kör csak akkor mozdul, ha az érintés a középpontjához megfelelően közel következett be. Ilyenkor nem kell ütem-adó, hiszen az "ugrás" megfelelően kicsi. Ez azt is szimulálja, hogy a joystick nem ugrik magától a kezembe, ha nem a tetejét fogom meg. Persze a "visszaúthoz" elengedés után még mindig szükséges az előző módszer.
((Nem dolgoztam még két külön View-val az érintéssel kapcsolatban, de nagy a gyanúm, hogy nem kell törődni, csak az elsődleges érintéssel, mert mindkettő azt kapja meg. Ezt ki kellene próbálnom.))
Ez persze csak az én ötletem, lehet, hogy más tud ennél jobbat is. Külön-külön már minden részét elkészítettem a folyamatnak, csak nem ilyen összefüggésben - ennek alapján szerintem azért el lehet vele játszani, mire összeáll, de megvalósítható. ((Ha nem sürgős, a konkrét megvalósításban is szívesen segítek, a grafika és az időzítés most nálam is pont napirenden van.)) -
thon73
tag
válasz shinodas #657 üzenetére
Pedig az nem nehéz, nekem inkább az időzítéssel gyűlt meg a bajom.
1. KÉT View esetén csak az egy érintéssel kell foglalkozni sztem.
2. KÖZÖS View-ban végig kell menni az összes érintés tömbjén, mint a fenti példában.
Én ellenőrizném a koordináták alapján, melyik ID koordinátája van a joystick körének területén.
A. lehetőség: Továbbra is végigmegyek az indexen, de ennek az ID-nek az alapján mozgatom a kört. Ha az ID eltűnt, akkor ez az érintés befejeződött. Kell keresnem egy újat, v. visszavinni középre a joysticket, és utána keresni.
B. lehetőség: ugyanúgy végigmegyek a tömbön, de nem foglalkozom az ID-vel, hanem ami megfelelően közel van a középpontjához, oda mozdítom a kört. Ha nincs ilyen, mehet vissza középre.Az egész kulcsa az, hogy amíg egy ponton is érinted a képet, az ID megmarad. Ha elengedted a képet, akkor teljesen új érintés kezdődik, új Idkkel. Ezért kell az elején a megf. érintést mindenképp a koord. alapján kiválasztani.
-
thon73
tag
válasz shinodas #661 üzenetére
Itt egy lehetséges megoldás. API10 és AIDE alatt készült, de elvileg bármiben működik. 800x480 pixeles képernyőm van, de persze a méretek a képnek megfelelően változtathatóak. Az egyszerűség kedvéért beágyazott View-t használtam, ill. nem ellenőrzi a View beállításait, ez végleges megoldásnál ildomos!
A kód sok helyen nincs optimalizálva, inkább jól érthetőt akartam írni. ((Pl. én nem is tennék két joysticket egy view-ba, vagy ha igen, akkor két külön objektumként stb.))public class JoystickActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(new Felulet(this));
}
public class Felulet extends View
{
private float[] origox = {200f, 600f};
private float[] origoy = {180f, 220f};
private float joyx[] = {origox[0], origox[1]};
private float joyy[] = {origoy[0], origoy[1]};
private float joyarea = 150f;
private float joyrad = 40f;
private int joyid[] = {-1, -1};
private Paint area;
private Paint rad;
public Felulet(Context context)
{
this(context, null, 0);
}
public Felulet(Context context, AttributeSet attrs)
{
this(context, attrs, 0);
}
public Felulet(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
area=new Paint();
area.setStyle(Paint.Style.STROKE);
area.setColor(Color.RED);
area.setStrokeWidth(5f);
rad=new Paint();
rad.setStyle(Paint.Style.FILL_AND_STROKE);
rad.setColor(Color.GREEN);
rad.setStrokeWidth(5f);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
switch (event.getActionMasked())
{
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
int pointerCount = event.getPointerCount();
for (int n=0; n<2; n++)
{
if (joyid[n] == -1)
{
for (int cnt = 0; cnt < pointerCount; cnt++)
{
if (distance(joyx[n], joyy[n], event.getX(cnt), event.getY(cnt)) < joyrad)
{
joyid[n] = event.getPointerId(cnt);
break;
}
}
}
else
{
boolean id_flag = false;
for (int cnt = 0; cnt < pointerCount; cnt++)
{
if (joyid[n] == event.getPointerId(cnt))
{
if (distance(origox[n], origoy[n], event.getX(cnt), event.getY(cnt)) < joyarea - joyrad)
{
joyx[n] = event.getX(cnt);
joyy[n] = event.getY(cnt);
this.invalidate();
}
else
{
// aránypárral v. szögfüggvénnyel mozgatható a kerületen
}
id_flag=true;
break;
}
}
if (!id_flag)
reset_joy(n);
}
}
break;
case MotionEvent.ACTION_UP:
reset_joy(0);
reset_joy(1);
break;
}
return true;
}
protected void reset_joy(int n)
{
joyid[n] = -1;
joyx[n] = origox[n];
joyy[n] = origoy[n];
this.invalidate();
}
protected float distance(float x1, float y1, float x2, float y2)
{
float x = x1 - x2;
float y = y1 - y2;
return FloatMath.sqrt(x * x + y * y);
}
@Override
protected void onDraw(Canvas canvas)
{
for (int n=0; n<2; n++)
{
canvas.drawCircle (origox[n], origoy[n], joyarea, area);
canvas.drawCircle (joyx[n], joyy[n], joyrad, rad);
}
}
}
}Az elv: a két index a két külön joysticket jelenti. Origox/y a közepe a két joysticknek, Joyx/y pedig az aktuális helyzete. Joyrad (kiskör) karikán belül lehet csak "megfogni" a joysticket, Joyarea (nagykör) sugaron kívül nem tud mozogni. A távolságot Pithagorasz tétellel számolja, ez nem a legjobb helyen van az osztályon belül.
A JoyId a legfontosabb: ha -1, akkor nincs érintés hozzárendelve (középen van a joystick). Ha egy érintés belelép a kiskörbe, akkor annak id-je lesz a JoyId és azt követi. A nagykör szélén megáll, de az érintéshez továbbra is ragaszkodik. Nem akartam bonyolítani, de az igazi az lenne, ha a köríven menne az ujjad után. (a megjegyzés helyén kezelhető ez)
Ha az Id eltűnik (ezt ellenőrzi a flag), vagyis azt az ujjad felemelted, akkor középre áll. Szintúgy akkor is, ha ACTION_UP lesz, vagyis minden ujj elhagyta a képet. Ilyenkor lehetne ütemadóval visszaúsztatni, de kis méretben az ugrás sem zavaró.
Ilyenre gondoltál? Remélem segít továbblépni, a lényeg úgyis az ID kezelés volt. Ha valami nem tiszta, szívesen segítek. -
thon73
tag
válasz shinodas #725 üzenetére
Az én tapasztalataim itt vannak: [link]
Gondolom, neked a Miként használjuk Linux alatt... rész lesz a jó. Nem az a gond, hogy nem jó a vendor kód a géphez? De ezt gép és udev file nélkül nem lehet megmondani.Apropó, az én fenti kérdéseimre senkinek nincs ötlete? Ez a Fragmentes dolog egyáltalán nem úgy működik nekem, ahogy a nagykönyvben meg van írva. (Igaz, legalább működik )
-
thon73
tag
válasz shinodas #727 üzenetére
Akár hiszitek, akár nem, tegnap este ugyanebbe a problémába futottam bele. Mivel egy barátom Wayteq xTab-700dc készüléke nem óhajtott drivert telepíteni a munkahelyi WinXP alatt, hazavittem reggel, ahol viszont Ubuntu 12.04 van. Nem találta ez sem...
lsusb parancs alapján a Vendor-kód 2207, ezt beírtam a /etc/udev/rules.d/51-android.rules file-ba, közvetlenül a Samsung alá (ami viszont működik).
SUBSYSTEM=="usb", ATTR{idVendor}=="2207", MODE="0666"
Az adb device parancs azonban csak a Samsungot látta.Az ~/.android/adb_usb.ini file az én gépemen egyáltalán nem létezett (pedig sgsII prímán működik), mindenesetre létrehoztam ezt
0x2207
tartalommal. Kétségtelen, újra kellett indítanom a rendszert, de innentől az adb látja az xTab-ot is.
((Elég vicces a sorszáma:
0123456789ABCDEF
Gondolom, az összes többié is ugyanez lesz ))Csak azt nem tudom, az SO hozzászólásban lévő fejléc alapján nem kellene ezt
android update adb paranccsal készíteni. Mindenesetre az (még) nem ment, a fenti viszont igen.Neked sikerült beüzemelni?
-
thon73
tag
válasz shinodas #733 üzenetére
ITT leírtam, amit csináltam. Menj be a megfelelő (sdk/platform-tools) mappába, ott az adb. És ne felejtsd előle a ./-t! (mint régi win-es, én is mindig lefelejtem, de a Linux NEM keres az aktuális mappában sem!)
Azóta tovább olvastam, a Google is azt írja, hogy így kell csinálni (kézzel). Két dolgot nem értek: miért kell ezt kézzel csinálni, ill. a Samsungnál pl. miért nem kellett csinálni? Annak az ID-jét talán tudta a cég, a kinaiékat meg nem?? -
-
Karma
félisten
válasz shinodas #804 üzenetére
Két dolog maradt ki:
1) Semmit se konfiguráltál be az Intenten. Vagy egy action stringet adj neki (amit manifestben regisztráltál a célactivityhez), vagy használd a setClass metódust hogy Java osztály szinten hivatkozz a másikra.Utóbbi pl.: intent.setClass(ValasztoActivity.this, CsatlakozoActivity.class);
2) Az Intentet el kellene küldened, anélkül semmit se ér ValasztoActivity.this.startActivity(intent); kéne a finish() elé.
[ Szerkesztve ]
“All nothings are not equal.”
Új hozzászólás Aktív témák
- Politika
- Trollok komolyan
- XGS24 - Bemutatkozott a DOOM - The Dark Ages
- Vezetékes FÜLhallgatók
- Elektromos rásegítésű kerékpárok
- Luck Dragon: Asszociációs játék. :)
- Vicces képek
- Autós topik látogatók beszélgetős, offolós topikja
- Poco F3 - a mindenes, de nem mindenkinek
- Projektor topic
- További aktív témák...
Állásajánlatok
Cég: Ozeki Kft.
Város: Debrecen