آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

عیدی من به کاربران-آموزش شناور کردن یک لایه حتی با بستن برنامه

omidronaldoo  9 سال پیش  7 سال پیش
+74 0

سلام دوستان پیشاپیش عیدتون مبارک.اینم عیدی من به کاربران.آموزش شناور کردن یک لایه در کل گوشی رو میدم.آموزش به صورت کامل قرار داده شد.اینم خروجی برنامه

+2 0
اگه میشه یه نمونه برنامه بدین که بدونیم شناور کردن لایه یعنی چی (9 سال پیش)
+2 0
شما حتما برنامه toucher pro رو دیدین که یک دکمه گوشه گوشیتون همیشه هست.خوب من اینجا طریقه ساختن اینو آموزش دادم (9 سال پیش)
+1 0
(9 سال پیش)
 برای این سوال 13 پاسخ وجود دارد.
پاسخ به سوال 
omidronaldoo  9 سال پیش
+10 0

خوب ما برای طراحی نیازبه یک لایه داریم

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:background="#ffacb0b5">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/relativeLayout"
        android:gravity="right">

        <View
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:background="#ff444bff" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/close_service"
            android:src="@drawable/close"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:layout_marginRight="10dp" />
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center|center_vertical|center_horizontal"
        android:layout_alignParentLeft="false"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/relativeLayout">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Button"
            android:id="@+id/button"
            android:layout_marginTop="115dp"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Button"
            android:id="@+id/button2"
            android:layout_alignBottom="@+id/button"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="44dp" />
    </RelativeLayout>

</RelativeLayout>
پاسخ به سوال 
omidronaldoo  9 سال پیش
+14 0

در مرحله بعد ما برای اینکه بتونبم یک لایه رو تو صفحه ها داشته باشیم نیاز داریم که یک کلاس سرویس درست کنیم.

 package float_button.example.com.float_button;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Builder;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;


/**
 * Created by shadow on 7/6/2015.
 */
public class float_layout extends Service {
    private WindowManager windowManager;

    private LayoutInflater _layOutInflater;
    private View floatView;
    private Button btn1;
    private ImageView close_service;
    private int notifyId = 0;


    @Override public IBinder onBind(Intent intent) {
        // Not used
        return null;
    }

    @Override public void onCreate() {
        super.onCreate();

        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        _layOutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);



        final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT);

        params.gravity = Gravity.TOP | Gravity.CENTER;
        params.x = 0;
        params.y = 100;

        floatView = _layOutInflater.inflate(R.layout.float1, null);



        windowManager.addView(floatView, params);

        close_service=(ImageView)floatView.findViewById(R.id.close_service);
        btn1=(Button)floatView.findViewById(R.id.button);



        close_service.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopSelf();

            }
        });
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getBaseContext(), "clicked", Toast.LENGTH_LONG).show();
            }
        });


        floatView.setOnTouchListener(new View.OnTouchListener() {
            public int initialX;
            public int initialY;
            public float initialTouchX;
            public float initialTouchY;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        initialX = params.x;
                        initialY = params.y;
                        initialTouchX = event.getRawX();
                        initialTouchY = event.getRawY();
                        return true;
                    case MotionEvent.ACTION_UP:
                        return true;
                    case MotionEvent.ACTION_MOVE:
                        params.x = initialX + (int) (event.getRawX() - initialTouchX);
                        params.y = initialY + (int) (event.getRawY() - initialTouchY);
                        windowManager.updateViewLayout(floatView, params);
                        return true;
                }
                return false;
            }
        });
    }

   





    @Override
    public void onDestroy() {
        super.onDestroy();
        if (floatView != null) windowManager.removeView(floatView);
        
    }
}

 

0 0
تو اینجا ما اومدیم لایه رو تعریف کردیم و کد هایی دادیم که بتونه شناور بشهو بتونیم جا به جاش کنیم در صفحه (9 سال پیش)
0 0
نیازی به توضیح اضافه نداره (9 سال پیش)
0 0
من این کدها رو نوشتم و همه چیز هم درست اجرا میشه . ولی روی اندروید 6 از خط windowManager.addView(floatView, params); خطا میگیره که باید مجوز SYSTEM_ALERT_WINDOW رو بگیری . مگه این پرمیشن جزء پرمیشن های ران تایمه ؟!! در هر حال کدهای ران تایم پرمیشن رو گذاشتم . حالا که اجرا میکنم میره قسمت تنظیمات و یه گزینه ای به نام draw over other apps داره که باید فعال بشه بعد از فعال کردن برمیگردم به برنامه ولی لایه رو نشون نمیده و بعد از اون هر بار که سرویس رو استارت میکنم لایه نمایش داده نمیشه . البته بگم روی اندروید زیر 6 نشون میده ولی روی 6 به بالا با اینکه مجوز داره ، نشون نیمده !!! دلیلش چیه ؟ (7 سال پیش)
پاسخ به سوال 
omidronaldoo  9 سال پیش
+10 0

بعد این پرمیشن رو به منیفست اضافه میکنیم.

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

و در آخر واسه اجرا سرویس این کد رو داخل یک کلاس دیگه میزاریم

 startService(new Intent(MainActivity.this, float_layout.class));
+1 0
دوست عزیز میشه یه نمونه پروژه بزاری (9 سال پیش)
0 0
این خودش نمونه پروژست (9 سال پیش)
+2 0
من اکلیپس ندارم با اندروید استودیو کار میکنم (9 سال پیش)
0 0
مشکلی نیست میشه بزارید ممنون میشم (9 سال پیش)
0 0
آموزش تون عالی بود (9 سال پیش)
+1 0
برا من زمان اجرا هیچ اتفاقی نمیفته. توی main تابع startService رو همونطوری که شما گفتید صدا زدم. ولی فایل main.xml رو نشون میده و اصلا به float1.xml نمیره. (9 سال پیش)
+1 0
شما باید سرویس رو تو مانیفست معرفی کنید (9 سال پیش)
0 0
من میخوام توش یک ادیت تکست بازکنم ولی مشکلی که هست اینه که کیبورد دستگاه باز نمیشه کسی می تونه کمکم کنه (9 سال پیش)
0 0
می تونید کمکم کنید (9 سال پیش)
0 0
اگه روشی برای باز کردن کیبورد پیدا کردم حتما میزارم (9 سال پیش)
0 0
من زیاد رو این کار نکردم در حد شناور کردن و جا به جایی و ایجاد یک لایه کاستوم بوده (9 سال پیش)
0 0
مرسی از وقتی که گذاشتید. (7 سال پیش)
پاسخ به سوال 
Farnad  9 سال پیش
0 0

برنامه پیاده سازی شد ولیکن هنگام صدا زدن کلاس float_layout هیچ اتفاقی نمیافتد (permision مربوطه نیز در manifest اضافه گردیده)

+1 0
شما باید سرویس رو تو مانیفست معرفی کنید (9 سال پیش)
+1 0
ببخشید کد معرفی سرویس تو منیفست رو یادم رفت بزارم شرمنده.مثل activity تعریف میشه فقط جایه activity باید service بزارید (9 سال پیش)
0 0
اگه توی onStartCommant بزاریم چطور میشه؟ (9 سال پیش)
پاسخ به سوال 
doost_fu  9 سال پیش
+1 0

منم تست کردم درسته و کامل اجرا شد
ولی همین مورد دوستمون رو چک کردم کیبورد باز نمیشه !
بعد یه سوال دیگه موقعی که به این سرویس منتقل میشیم از طریق کد زیر :

 startService(newIntent(MainActivity.this, float_layout.class));

چطور میشه مثل اکتیویتی ( putExtra ) و یا مقادیر ارسال کنیم ؟

ویرایش : میشه همون طور ارسال کرد ولی برا گرفتنش احتمالا باید از متد onStartCommand استفاده کرد : لینک

0 0
در مورد کیبورد چیزی پیدا نکردید؟؟؟؟ (9 سال پیش)
0 0
فعلا نه ولی احتمالا چون اون لایه داخل سرویس تعریف شده و داخل اکتیویتی نیست راه ش فرق میکنه ! (9 سال پیش)
+1 0
شما یک کلاس بزار به اسم واسط یا vaset.نمیخواد از چیزی extends بشه.داخلش میتونی string int هر چی میخوای تعریف کنی.فقط نوعش public باشه.وقتی که سرویس صدت زده میشه.یه مقدار به string یا int اینا بده.بعد داخل service از کلاس واسط بخونش (9 سال پیش)
0 0
ممنون این مشکل حل شد بود الان سوال همون باز شدن صفحه کلید با زدن ادیت تکس داخل همین پنجره بود ! (9 سال پیش)
پاسخ به سوال 
Hossein Lamei Ramandi  9 سال پیش
0 0

دوستان من هرکاری میکنم در منی فست از سرویس خطا میگیره

 

پاسخ به سوال 
Farnad  9 سال پیش
+4 0

من اینو تو منیفست اضافه کردم حل شد (شما باید نام پکیج خودتون رو بنویسید)

        <service
             android:name="com.example.floatapp.float_layout"
            android:label="@string/app_name" >
        </service >

0 0
کار نمیکنه لایه شناور نمایش داده نمیشه faranaآقا میشه یه پروژه نمونه از همین لایه شناور قرار بدید ممنون (9 سال پیش)
0 0
ممنون از شمااینو یادم رفته بود بزارم (9 سال پیش)
پاسخ به سوال 
sajjadgh  9 سال پیش
+3 0

سلام

برای اینکه امکان باز شدن کیبورد ایجاد بشه کد زیر را به جای مشابهش در کدهای بالا قرار دهید

 final WindowManager.LayoutParamsparams=newWindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager
.LayoutParams.WRAP_CONTENT,
WindowManager
.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
,
PixelFormat
.TRANSLUCENT);

 
0 0
دوستان چرا وقتی از لایه شناور استفاده میکنیم دکمه back گوشی دیکه کار نمیکنه؟ البته وقتی که از کد مربوط به کیبورد استفاده میشود (9 سال پیش)
0 0
دوستان چرا وقتی از لایه شناور استفاده میکنیم دکمه back گوشی دیکه کار نمیکنه؟ البته وقتی که از کد مربوط به کیبورد استفاده میشود چون من از ادیت تکس استفاده میکنم نمیتونم از کد WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL استفاده کنم (9 سال پیش)
0 0
منظورم این بود WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE (9 سال پیش)
پاسخ به سوال 
Ghost  9 سال پیش
+7 0

سلام دوستان عزیز .

omidronaldoo ممنون ازت . خیلی وقت بود دنبال این کد بودم .

چند نفری مشکل داشتند گفتم پروژه کاملش رو اینجا بگذارم تا هرکی مشکل داشت دانلود کنه و ایمپورت کنه

اینم لینک دانلود : دانلود فایل

موفق باشید :)

+1 0
ممنون.اگه یکم روش کار بشه میشه خیلی کارا باهاش کرد (9 سال پیش)
+1 0
دستت درست (9 سال پیش)
0 0
ممنون دوست عزیز چرا بعد از اجرا چند لحظه ناپدید میشه و دوباره ساخته میشه؟ یعنی سرویس از نو اجرا میشه چرا (8 سال پیش)
پاسخ به سوال 
Hossein Lamei Ramandi  9 سال پیش
0 0

ای بابا

این چرا اینجوریه پروژه شمارو میتونه اجرا کنه ولی من همون پروژه رو کپی میکنم هم اجرا نمیکنه

0 0
مشکل حل شد (9 سال پیش)
پاسخ به سوال 
moji19  9 سال پیش
+2 0

دوستان توجه کنید:

من این خط کد رو توی AdapterNote صدا زدم، ولی ارور گرفت که startService رو نمیشناسه.

راح حلش اینه که اسم اکتیویتی رو اولش اضافه کنی که اگه طبق آموزش استاد کلاس G را تعریف کرده باشید فقط کافیه این طور بنویسید:

 G.currentActivity.startService(newIntent(MainActivity.this, float_layout.class));

پاسخ به سوال 
سعید  9 سال پیش
0 0

دوستان چرا وقتی از لایه شناور استفاده میکنیم دکمه back گوشی دیکه کار نمیکنه؟

البته وقتی که از کد مربوط به کیبورد استفاده میشود

پاسخ به سوال 
کیانی  7 سال پیش
0 0

با سلام
قصد دارم با کلیک شدن آیکن درون لایه شناور،اکتیویتیه مینیمایز شده رو بیاره بالا و از کد زیر استفاده کردم ولی کرش میکنه، لطفأ راهنمایی بفرمایید

  close_service.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
//stopSelf();

Intent intent2 = new Intent(float_layout.this, WindwoActivity.class);
intent2.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent2);
}
});
0 0
با سلام لطفأ راهنمایی بفرمایید که آیا راهی هست( مثل گروه تلگرام یا مشابه این) که زودتر بتونیم از راهنمایی دوستان بهره ببریم و به پاسخ برسیم یا خیر؟ بعد از گذشت 1 هفته هیچ پاسخی نگرفتم (7 سال پیش)
0 0
با سلام از دوستان و اساتید گرامی خواهشمندم راهنمایی بفرمایند با تشکر (7 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .