Hirdetés
- Gyorsabb processzort igen, memóriát alig kapott a Xiaomi új HD tévéokosítója
- Állandó tisztaság a be quiet! Dark Sweeper tápegységgel
- Hivatalosan is elkezd védekezni az Intel csodafegyvere ellen az új Geekbench
- Természetfeletti erő? Acer Nitro V 16 AI notebook Gorgon Pointtal
- Még több képet generál és shadert is előfordít az új NVIDIA App
- Milyen billentyűzetet vegyek?
- Autós kamerák
- Milyen videókártyát?
- XMLTV EPG letöltő progi
- Milyen CPU léghűtést vegyek?
- Így VERNEK ÁT a KAMU webshopok!
- Szomjan halunk, míg az AI dolgozik
- Tápos kibeszélő offtopik
- Állandó tisztaság a be quiet! Dark Sweeper tápegységgel
- Hivatalosan is elkezd védekezni az Intel csodafegyvere ellen az új Geekbench
Új hozzászólás Aktív témák
-
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.
Új hozzászólás Aktív témák
- Google Pixel topik
- Audi, Cupra, Seat, Skoda, Volkswagen topik
- MasterDeeJay: Comet lake (10gen) és DDR3 - mert ilyet is lehet!
- A fociról könnyedén, egy baráti társaságban
- Hegesztés topic
- Milyen billentyűzetet vegyek?
- Saros (PS5)
- Autós kamerák
- Crimson Desert
- MIUI / HyperOS topik
- További aktív témák...
- Asus 15.6,core i3 8145U(4x3,9Ghz)IntelUHD VGA,MAGYAR Vil.bill.,8-20GB RAM,SSD,,Win.11
- HP 15,6"FullHD ,8.gen. Core i5(8X3,6Ghz)R5 2/4GB VGA,8-32GB DDR4 RAM,SSD+HDD?,jó akku,szép áll.
- Asus Phoenix NVIDIA GeForce RTX 3060 12 GB
- Thinkpad X13 Gen4 13.3" FHD+ IPS i7-1365U 16GB 512GB NVMe ujjlolv gar
- Thinkpad X13 Gen2i 13.3" FHD+ IPS i5-1145G7 16GB 256GB NVMe gar
- MikroTik CCR2004-16G-2S+
- AKCIÓ! 4TB Seagate Skyhawk ST4000 SATA HDD meghajtó garanciával hibátlan működéssel
- Akció! Csere-Beszámítás! Samsung 990 Pro 2TB Nvme SSD PCIE 4.0!
- 264 - Lenovo ThinkBook 16 (G7 ARP) - AMD Ryzen 5 7535HS, no GPU
- 0PERCES BOSE QuietComfort Ultra Headphones, zajszűrős, Bluetooth fejhallgató!
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest

