بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

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

مدیریت گفتگو
omidronaldoo 11 سال پیش
آخرین تغییر: 8 سال پیش

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

نظرات

peyman_m1992 11 سال پیش
اگه میشه یه نمونه برنامه بدین که بدونیم شناور کردن لایه یعنی چی
omidronaldoo 11 سال پیش
شما حتما برنامه toucher pro رو دیدین که یک دکمه گوشه گوشیتون همیشه هست.خوب من اینجا طریقه ساختن اینو آموزش دادم

پاسخ‌ها 13

omidronaldoo 11 سال پیش

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

 <?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 11 سال پیش

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

 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);
        
    }
}

 

نظرات

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

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

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

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

 startService(new Intent(MainActivity.this, float_layout.class));

نظرات

omidronaldoo 11 سال پیش
این خودش نمونه پروژست
omidronaldoo 11 سال پیش
من اکلیپس ندارم با اندروید استودیو کار میکنم
atf 11 سال پیش
آموزش تون عالی بود
cormen2 11 سال پیش
برا من زمان اجرا هیچ اتفاقی نمیفته. توی main تابع startService رو همونطوری که شما گفتید صدا زدم. ولی فایل main.xml رو نشون میده و اصلا به float1.xml نمیره.
atf 11 سال پیش
شما باید سرویس رو تو مانیفست معرفی کنید
atf 11 سال پیش
من میخوام توش یک ادیت تکست بازکنم ولی مشکلی که هست اینه که کیبورد دستگاه باز نمیشه کسی می تونه کمکم کنه
atf 11 سال پیش
می تونید کمکم کنید
omidronaldoo 11 سال پیش
اگه روشی برای باز کردن کیبورد پیدا کردم حتما میزارم
omidronaldoo 11 سال پیش
من زیاد رو این کار نکردم در حد شناور کردن و جا به جایی و ایجاد یک لایه کاستوم بوده
m2004 9 سال پیش
مرسی از وقتی که گذاشتید.
Farnad 11 سال پیش

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

نظرات

atf 11 سال پیش
شما باید سرویس رو تو مانیفست معرفی کنید
omidronaldoo 11 سال پیش
ببخشید کد معرفی سرویس تو منیفست رو یادم رفت بزارم شرمنده.مثل activity تعریف میشه فقط جایه activity باید service بزارید
doost_fu 11 سال پیش

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

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

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

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

نظرات

atf 11 سال پیش
در مورد کیبورد چیزی پیدا نکردید؟؟؟؟
doost_fu 11 سال پیش
فعلا نه ولی احتمالا چون اون لایه داخل سرویس تعریف شده و داخل اکتیویتی نیست راه ش فرق میکنه !
omidronaldoo 11 سال پیش
شما یک کلاس بزار به اسم واسط یا vaset.نمیخواد از چیزی extends بشه.داخلش میتونی string int هر چی میخوای تعریف کنی.فقط نوعش public باشه.وقتی که سرویس صدت زده میشه.یه مقدار به string یا int اینا بده.بعد داخل service از کلاس واسط بخونش
doost_fu 11 سال پیش
ممنون این مشکل حل شد بود الان سوال همون باز شدن صفحه کلید با زدن ادیت تکس داخل همین پنجره بود !
Hossein Lamei Ramandi 11 سال پیش

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

 

نظرات

Farnad 11 سال پیش

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

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

نظرات

Hossein Lamei Ramandi 11 سال پیش
کار نمیکنه لایه شناور نمایش داده نمیشه faranaآقا میشه یه پروژه نمونه از همین لایه شناور قرار بدید ممنون
omidronaldoo 11 سال پیش
ممنون از شمااینو یادم رفته بود بزارم
sajjadgh 11 سال پیش

سلام

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

 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);

 

نظرات

سعید 10 سال پیش
دوستان چرا وقتی از لایه شناور استفاده میکنیم دکمه back گوشی دیکه کار نمیکنه؟ البته وقتی که از کد مربوط به کیبورد استفاده میشود
سعید 10 سال پیش
دوستان چرا وقتی از لایه شناور استفاده میکنیم دکمه back گوشی دیکه کار نمیکنه؟ البته وقتی که از کد مربوط به کیبورد استفاده میشود چون من از ادیت تکس استفاده میکنم نمیتونم از کد WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL استفاده کنم
سعید 10 سال پیش
منظورم این بود WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
Ghost 11 سال پیش

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

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

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

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

موفق باشید :)

نظرات

omidronaldoo 11 سال پیش
ممنون.اگه یکم روش کار بشه میشه خیلی کارا باهاش کرد
JKM 10 سال پیش
ممنون دوست عزیز چرا بعد از اجرا چند لحظه ناپدید میشه و دوباره ساخته میشه؟ یعنی سرویس از نو اجرا میشه چرا
Hossein Lamei Ramandi 11 سال پیش

ای بابا

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

نظرات

moji19 11 سال پیش

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

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

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

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

نظرات

سعید 10 سال پیش

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

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

نظرات

کیانی 9 سال پیش

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

  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);
}
});

نظرات

کیانی 9 سال پیش
با سلام لطفأ راهنمایی بفرمایید که آیا راهی هست( مثل گروه تلگرام یا مشابه این) که زودتر بتونیم از راهنمایی دوستان بهره ببریم و به پاسخ برسیم یا خیر؟ بعد از گذشت 1 هفته هیچ پاسخی نگرفتم
کیانی 9 سال پیش
با سلام از دوستان و اساتید گرامی خواهشمندم راهنمایی بفرمایند با تشکر

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