X-Git-Url: https://git.mdrn.pl/wl-app.git/blobdiff_plain/48b2fe9f7c2dc3d9aeaaa6dbfb27c7da4f3235ff..269195b3729c1bdc22e9053ee4ebca667ea8549d:/Android/webViewMarker/src/main/java/com/blahti/drag/MyAbsoluteLayout.java diff --git a/Android/webViewMarker/src/main/java/com/blahti/drag/MyAbsoluteLayout.java b/Android/webViewMarker/src/main/java/com/blahti/drag/MyAbsoluteLayout.java new file mode 100755 index 0000000..ae709ec --- /dev/null +++ b/Android/webViewMarker/src/main/java/com/blahti/drag/MyAbsoluteLayout.java @@ -0,0 +1,250 @@ +/* + * This is a modified version of a class from the Android Open Source Project. + * The original copyright and license information follows. + * + * Copyright (C) 2006 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.blahti.drag; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.RemoteViews.RemoteView; + +/** + * A layout that lets you specify exact locations (x/y coordinates) of its + * children. Absolute layouts are less flexible and harder to maintain than + * other types of layouts without absolute positioning. + * + *

XML attributes

See {@link + * android.R.styleable#ViewGroup ViewGroup Attributes}, {@link + * android.R.styleable#View View Attributes}

+ * + *

Note: This class is a clone of AbsoluteLayout, which is now deprecated. + */ + +@RemoteView +public class MyAbsoluteLayout extends ViewGroup { + public MyAbsoluteLayout(Context context) { + super(context); + } + + public MyAbsoluteLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public MyAbsoluteLayout(Context context, AttributeSet attrs, + int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int count = getChildCount(); + + int maxHeight = 0; + int maxWidth = 0; + + // Find out how big everyone wants to be + measureChildren(widthMeasureSpec, heightMeasureSpec); + + // Find rightmost and bottom-most child + for (int i = 0; i < count; i++) { + View child = getChildAt(i); + if (child.getVisibility() != GONE) { + int childRight; + int childBottom; + + MyAbsoluteLayout.LayoutParams lp + = (MyAbsoluteLayout.LayoutParams) child.getLayoutParams(); + + childRight = lp.x + child.getMeasuredWidth(); + childBottom = lp.y + child.getMeasuredHeight(); + + maxWidth = Math.max(maxWidth, childRight); + maxHeight = Math.max(maxHeight, childBottom); + } + } + + // Account for padding too + maxWidth += getPaddingLeft () + getPaddingRight (); + maxHeight += getPaddingTop () + getPaddingBottom (); + /* original + maxWidth += mPaddingLeft + mPaddingRight; + maxHeight += mPaddingTop + mPaddingBottom; + */ + + // Check against minimum height and width + maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight()); + maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth()); + + setMeasuredDimension(resolveSize(maxWidth, widthMeasureSpec), + resolveSize(maxHeight, heightMeasureSpec)); + } + + /** + * Returns a set of layout parameters with a width of + * {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT}, + * a height of {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} + * and with the coordinates (0, 0). + */ + @Override + protected ViewGroup.LayoutParams generateDefaultLayoutParams() { + return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0, 0); + } + + @Override + protected void onLayout(boolean changed, int l, int t, + int r, int b) { + int count = getChildCount(); + + int paddingL = getPaddingLeft (); + int paddingT = getPaddingTop (); + for (int i = 0; i < count; i++) { + View child = getChildAt(i); + if (child.getVisibility() != GONE) { + + MyAbsoluteLayout.LayoutParams lp = + (MyAbsoluteLayout.LayoutParams) child.getLayoutParams(); + + int childLeft = paddingL + lp.x; + int childTop = paddingT + lp.y; + /* + int childLeft = mPaddingLeft + lp.x; + int childTop = mPaddingTop + lp.y; + */ + child.layout(childLeft, childTop, + childLeft + child.getMeasuredWidth(), + childTop + child.getMeasuredHeight()); + + } + } + } + + @Override + public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { + return new MyAbsoluteLayout.LayoutParams(getContext(), attrs); + } + + // Override to allow type-checking of LayoutParams. + @Override + protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { + return p instanceof MyAbsoluteLayout.LayoutParams; + } + + @Override + protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { + return new LayoutParams(p); + } + + /** + * Per-child layout information associated with MyAbsoluteLayout. + * See + * {@link android.R.styleable#MyAbsoluteLayout_Layout Absolute Layout Attributes} + * for a list of all child view attributes that this class supports. + */ + public static class LayoutParams extends ViewGroup.LayoutParams { + /** + * The horizontal, or X, location of the child within the view group. + */ + public int x; + /** + * The vertical, or Y, location of the child within the view group. + */ + public int y; + + /** + * Creates a new set of layout parameters with the specified width, + * height and location. + * + * @param width the width, either {@link #MATCH_PARENT}, + {@link #WRAP_CONTENT} or a fixed size in pixels + * @param height the height, either {@link #MATCH_PARENT}, + {@link #WRAP_CONTENT} or a fixed size in pixels + * @param x the X location of the child + * @param y the Y location of the child + */ + public LayoutParams(int width, int height, int x, int y) { + super(width, height); + this.x = x; + this.y = y; + } + + /** + * Creates a new set of layout parameters. The values are extracted from + * the supplied attributes set and context. The XML attributes mapped + * to this set of layout parameters are: + * + *

+ * + * @param c the application environment + * @param attrs the set of attributes from which to extract the layout + * parameters values + */ + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + /* FIX THIS eventually. Without this, I don't think you can put x and y in layout xml files. + TypedArray a = c.obtainStyledAttributes(attrs, + com.android.internal.R.styleable.AbsoluteLayout_Layout); + x = a.getDimensionPixelOffset( + com.android.internal.R.styleable.AbsoluteLayout_Layout_layout_x, 0); + y = a.getDimensionPixelOffset( + com.android.internal.R.styleable.AbsoluteLayout_Layout_layout_y, 0); + a.recycle(); + */ + } + + /** + * {@inheritDoc} + */ + public LayoutParams(ViewGroup.LayoutParams source) { + super(source); + } + + public String debug(String output) { + return output + "Absolute.LayoutParams={width=" + + sizeToString(width) + ", height=" + sizeToString(height) + + " x=" + x + " y=" + y + "}"; + } + + /** + * Converts the specified size to a readable String. + * + * @param size the size to convert + * @return a String instance representing the supplied size + * + * @hide + */ + protected static String sizeToString(int size) { + if (size == WRAP_CONTENT) { + return "wrap-content"; + } + if (size == MATCH_PARENT) { + return "match-parent"; + } + return String.valueOf(size); + } + } // end class + +} // end class + +