Launcher3源码分析(CellLayout)

CellLayout是workspace的屏幕。 
CellLayout中的一些重要属性:

int mCellWidth;
int mCellHeight;
//每一个屏幕的行列数
int mCountX;//每一行的item个数
int mCountY;//每一列的item个数
//item之间的距离
int mWidthGap;//item之间的宽度
int mHeightGap;//item之间的高度
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

构造方法

public CellLayout(Context context, AttributeSet attrs, int defStyle){
    super(context,attrs,defStyle){
        setWillNotDraw(false);
        setClipToPadding(false);
        mLauncher = (Launcher)context;

        DeviceProfile grid = mLauncher.getDeviceProfile();
        TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.CellLayout,defStyle,0);
        mCellWidth = mCellHeight = -1;
        mFixedCellWidth = mFixedCellHeight = -1;
        //item之间的距离
        mWidthGap = mOriginalWidthGap = 0;
        mHeightGap = mOriginalHeightGap = 0;
        mMaxGap = Integer.MAX_VALUE;
        //每屏幕上的item行数列数
        //DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();grid是DeviceProfile的对象
        mCountX = (int) grid.inv.numColumns;
        mcountY = (int) grid.inv.numRows;
        mOccupied = new boolean[mCountX][mCountY];
        mTmpOccupied = new boolean[mCountX][mCountY];

        ……

        final Resources res = getResources();
        mHotseatScale = (float) grid.hotseatIconSizePx / grid.iconSizePx;
        //CellLayout缩略图背景,即长按屏幕空白处时CellLayout缩小时的背景图
        mBackground = (TransitionDrawable) res.getDrawable(R.drawable.bg_screenpanel);
        mBackground.setCallback(this);

        ……
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

在Workspace.java中加载CellLayout的布局,代码如下:

public long insertNewWorkspaceScreen(long screenId, int insertIndex){
    if (mWorkspaceScreens.containsKey(screenId)) {
            throw new RuntimeException("Screen id " + screenId + " already exists!");
    }

    // Inflate the cell layout, but do not add it automatically so //that we can get the newly created CellLayout.

    //加载CellLayout布局
    CellLayout newScreen = (CellLayout)mLauncher.getLayoutInflater().inflate(R.layout.workspace_screen,this,false);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

CellLayout中的一个item可以占多个Cell,CellInfo记录item的起始坐标、占多少格

public static final class CellInfo{
    View cell;
    int cellX = -1;
    int cellY = -1;
    int spanX;
    int spanY;
    long screenId;
    long container;

    public CellInfo(View v, ItemInfo info){
        cell = v;
        cellX = info.cellX;
        cellY = info.cellY;
        spanX = info.spanX;
        spanY = info.spanY;
        screenId = info.screenId;
        container = info.cotainer;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

CellLayout的触摸事件

public boolean onInterceptTouchEvent(MotionEvent ev){
    if(mUseTouchHelper || (mInterceptTouchListener != null && mInterceptTouchListener.onTouch(this,ev)){
        return true;
    }
    return false;
}

public boolean onTouchEvent(MotionEvent ev){
    boolean handled = super.onTouchEvent(ev);
    //检查workspace是否处在预览模式
    if(mLauncher.mWorkspace.isInOverviewMode() && mStylusEventHelper.checkAndPerformStylusEvent(ev)){
        return true;
    }
    return handled;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

设置cell间距、占格数的大小

public void setCellDimensions(int width, int height);
public void setGridSize(int x, int y);

你可能感兴趣的:(Launcher)