SampleWindow demo

SampleWindow.java 

package understanding.wms.samplewindow;

import android.content.res.Configuration;
import android.view.Surface;
import android.view.View;
import android.view.InputChannel;
import android.view.DisplayInfo;
import android.view.Gravity;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.view.Choreographer;
import android.view.MotionEvent;
import android.view.InputEvent;
import android.view.InputEventReceiver;
import android.view.Display;
import android.view.IWindow;
import android.view.IWindowManager;
import android.view.IWindowSession;
import android.view.WindowManagerGlobal;
import android.hardware.display.IDisplayManager;
import android.graphics.Rect;
import android.graphics.Point;
import android.graphics.Paint;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Looper;
import android.os.Binder;
import android.os.IBinder;
import android.os.ServiceManager;
import android.content.Context;

public class SampleWindow {
    public static void main(String[] args) {
        try{
            new SampleWindow().Run();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    IWindowSession mSession = null;

    InputChannel mInputChannel = new InputChannel();

    Rect mInsets = new Rect();
    Rect mFrame = new Rect();
    Rect mVisibleInsets = new Rect();

    Configuration mConfig = new Configuration();

    Surface mSurface = new Surface();

    Paint mPaint = new Paint();

    IBinder mToken = new Binder();

    MyWindow mWindow = new MyWindow();

    LayoutParams mLp = new LayoutParams();

    Choreographer mChoreographer = null;

    InputHandler mInputHandler = null;

    boolean mContinueAnime = true;

    public void Run() throws Exception {
        Looper.prepare();

        IWindowManager wms = IWindowManager.Stub.asInterface(
                ServiceManager.getService(Context.WINDOW_SERVICE)
                );
        mSession = WindowManagerGlobal.getWindowSession();

        IDisplayManager dm = IDisplayManager.Stub.asInterface(
                ServiceManager.getService(Context.DISPLAY_SERVICE)
                );
        DisplayInfo di = dm.getDisplayInfo(Display.DEFAULT_DISPLAY);
        Point screenSize = new Point(di.appWidth, di.appHeight);

        initLayoutParams(screenSize);

        installWindow(wms);

        mChoreographer = Choreographer.getInstance();

        scheduleNextFrame();

        Looper.loop();

        mContinueAnime = false;

        uninstallWindow(wms);
    }

    public void initLayoutParams(Point screenSize) {
        mLp.type = LayoutParams.TYPE_SYSTEM_ALERT;
        mLp.setTitle("SampleWindow");

        mLp.gravity = Gravity.LEFT|Gravity.TOP;
        mLp.x = screenSize.x / 4;
        mLp.y = screenSize.y / 4;

        mLp.width = screenSize.x / 2;
        mLp.height = screenSize.y / 2;

        mLp.flags = mLp.flags | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
    }

    public void installWindow(IWindowManager wms) throws Exception{
       wms.addWindowToken(mToken, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 0, null);

       mLp.token = mToken;

       mSession.add(mWindow, 0, mLp, View.VISIBLE, mInsets, mInputChannel);

       mSession.relayout(mWindow, 0, mLp, mLp.width, mLp.height, View.VISIBLE, 0, mFrame, mInsets, mVisibleInsets, mConfig, mSurface);
       if (!mSurface.isValid()) {
            throw new RuntimeException("Failed creating Surface.");
       }

       mInputHandler = new InputHandler(mInputChannel, Looper.myLooper());

    }

    public void uninstallWindow(IWindowManager wms) throws Exception {
        mSession.remove(mWindow);
        wms.removeWindowToken(mToken, 0);
    }

    public void scheduleNextFrame() {
        mChoreographer.postCallback(Choreographer.CALLBACK_ANIMATION, mFrameRender, null);
    }

    public Runnable mFrameRender = new Runnable() {
        @Override
        public void run() {
            try {
                long time = mChoreographer.getFrameTime() % 1000;

                if (mSurface.isValid()) {
                    Canvas canvas = mSurface.lockCanvas(null);
                    canvas.drawColor(Color.DKGRAY);
                    canvas.drawRect(2 * mLp.width * time / 1000 - mLp.width, 0, 2 * mLp.width * time /1000, 
                            mLp.height, mPaint);
                    mSurface.unlockCanvasAndPost(canvas);
                    mSession.finishDrawing(mWindow, null);
                }
                if (mContinueAnime) {
                    scheduleNextFrame();
                } 
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };

    class InputHandler extends InputEventReceiver {
        Looper mLooper = null;
        public InputHandler(InputChannel inputChannel, Looper looper) {
            super(inputChannel, looper);
            mLooper = looper;
        }

        @Override
        public void onInputEvent(InputEvent event) {
            if (event instanceof MotionEvent) {
                MotionEvent me = (MotionEvent)event;
                if (me.getAction() == MotionEvent.ACTION_UP) {
                    mLooper.quit();
                }
            }
            super.onInputEvent(event);
        }
    }

    class MyWindow extends IWindow.Stub {
        // Keeping default implements
    }
}

Android.mk


LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := samplewindow
include $(BUILD_JAVA_LIBRARY)

sw.sh


base=/system
export CLASSPATH=$base/framework/samplewindow.jar

exec app_process $base/bin understanding.wms.samplewindow.SampleWindow "$@"

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值