mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
Merge pull request #6 from NativeScript/android-studio
Project changed to support Android studio Implemented percentage layouts
This commit is contained in:
@@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="gen"/>
|
||||
<classpathentry kind="output" path="bin/classes"/>
|
||||
</classpath>
|
||||
22
.gitignore
vendored
22
.gitignore
vendored
@@ -1,14 +1,8 @@
|
||||
/.metadata/
|
||||
node_modules/
|
||||
dist/
|
||||
|
||||
local.properties
|
||||
|
||||
gen/
|
||||
armeabi-v7a/
|
||||
x86/
|
||||
obj/
|
||||
bin/
|
||||
.svn/
|
||||
.settings/
|
||||
test/
|
||||
.gradle
|
||||
/local.properties
|
||||
.idea/
|
||||
.DS_Store/
|
||||
build/
|
||||
gradlew
|
||||
gradlew.bat
|
||||
gradle/
|
||||
33
.project
33
.project
@@ -1,33 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>widgets</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
6
POM.xml
6
POM.xml
@@ -1,6 +0,0 @@
|
||||
<project>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.nativescript.widgets</groupId>
|
||||
<artifactId>nativescript-widgets</artifactId>
|
||||
<version>0.1.0</version>
|
||||
</project>
|
||||
19
android-widgets.iml
Normal file
19
android-widgets.iml
Normal file
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id="android-widgets" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="java-gradle" name="Java-Gradle">
|
||||
<configuration>
|
||||
<option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
|
||||
<option name="BUILDABLE" value="false" />
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/.gradle" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
15
build.gradle
Normal file
15
build.gradle
Normal file
@@ -0,0 +1,15 @@
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
buildscript {
|
||||
repositories {
|
||||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:1.3.0'
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
jcenter()
|
||||
}
|
||||
}
|
||||
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
#Tue Nov 03 10:36:19 EET 2015
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip
|
||||
Binary file not shown.
@@ -1,20 +0,0 @@
|
||||
# To enable ProGuard in your project, edit project.properties
|
||||
# to define the proguard.config property as described in that file.
|
||||
#
|
||||
# Add project specific ProGuard rules here.
|
||||
# By default, the flags in this file are appended to flags specified
|
||||
# in ${sdk.dir}/tools/proguard/proguard-android.txt
|
||||
# You can edit the include path and order by changing the ProGuard
|
||||
# include property in project.properties.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# Add any project specific keep options here:
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
||||
@@ -1,15 +0,0 @@
|
||||
# This file is automatically generated by Android Tools.
|
||||
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||
#
|
||||
# This file must be checked in Version Control Systems.
|
||||
#
|
||||
# To customize properties used by the Ant build system edit
|
||||
# "ant.properties", and override values to adapt the script to your
|
||||
# project structure.
|
||||
#
|
||||
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||
|
||||
# Project target.
|
||||
target=android-17
|
||||
android.library=true
|
||||
1
settings.gradle
Normal file
1
settings.gradle
Normal file
@@ -0,0 +1 @@
|
||||
include ':widgets'
|
||||
@@ -1,331 +0,0 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package org.nativescript.widgets;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager.NameNotFoundException;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.View.MeasureSpec;
|
||||
import android.view.ViewGroup.LayoutParams;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
/**
|
||||
* @author hhristov
|
||||
*
|
||||
*/
|
||||
public class CommonLayoutParams extends FrameLayout.LayoutParams {
|
||||
|
||||
static final String TAG = "NSLayout";
|
||||
static int debuggable = -1;
|
||||
private static final StringBuilder sb = new StringBuilder();
|
||||
|
||||
public CommonLayoutParams() {
|
||||
super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
|
||||
}
|
||||
|
||||
public float widthPercent = 0;
|
||||
public float heightPercent = 0;
|
||||
|
||||
public float topMarginPercent = 0;
|
||||
public float leftMarginPercent = 0;
|
||||
public float bottomMarginPercent = 0;
|
||||
public float rightMarginPercent = 0;
|
||||
|
||||
public int left = 0;
|
||||
public int top = 0;
|
||||
public int row = 0;
|
||||
public int column = 0;
|
||||
public int rowSpan = 1;
|
||||
public int columnSpan = 1;
|
||||
public Dock dock = Dock.left;
|
||||
|
||||
public static int getDesiredWidth(View view) {
|
||||
CommonLayoutParams lp = (CommonLayoutParams)view.getLayoutParams();
|
||||
return view.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;
|
||||
}
|
||||
|
||||
public static int getDesiredHeight(View view) {
|
||||
CommonLayoutParams lp = (CommonLayoutParams)view.getLayoutParams();
|
||||
return view.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
|
||||
}
|
||||
|
||||
// We use our own layout method because the one in FrameLayout is broken when margins are set and gravity is CENTER_VERTICAL or CENTER_HORIZONTAL.
|
||||
@SuppressLint("RtlHardcoded")
|
||||
public static void layoutChild(View child, int left, int top, int right, int bottom) {
|
||||
if (child.getVisibility() == View.GONE) {
|
||||
return;
|
||||
}
|
||||
|
||||
int childTop = 0;
|
||||
int childLeft = 0;
|
||||
|
||||
int childWidth = child.getMeasuredWidth();
|
||||
int childHeight = child.getMeasuredHeight();
|
||||
|
||||
CommonLayoutParams lp = (CommonLayoutParams)child.getLayoutParams();
|
||||
int gravity = lp.gravity;
|
||||
if (gravity == -1) {
|
||||
gravity = Gravity.FILL;
|
||||
}
|
||||
|
||||
int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK;
|
||||
|
||||
// If we have explicit height and gravity is FILL we need to be centered otherwise our explicit height won't be taken into account.
|
||||
if (lp.height >= 0 && verticalGravity == Gravity.FILL_VERTICAL) {
|
||||
verticalGravity = Gravity.CENTER_VERTICAL;
|
||||
}
|
||||
|
||||
switch (verticalGravity) {
|
||||
case Gravity.TOP:
|
||||
childTop = top + lp.topMargin;
|
||||
break;
|
||||
|
||||
case Gravity.CENTER_VERTICAL:
|
||||
childTop = top + (bottom - top - childHeight + lp.topMargin - lp.bottomMargin) / 2;
|
||||
break;
|
||||
|
||||
case Gravity.BOTTOM:
|
||||
childTop = bottom - childHeight - lp.bottomMargin;
|
||||
break;
|
||||
|
||||
case Gravity.FILL_VERTICAL:
|
||||
default:
|
||||
childTop = top + lp.topMargin;
|
||||
childHeight = bottom - top - (lp.topMargin + lp.bottomMargin);
|
||||
break;
|
||||
}
|
||||
|
||||
int horizontalGravity = Gravity.getAbsoluteGravity(gravity, child.getLayoutDirection()) & Gravity.HORIZONTAL_GRAVITY_MASK;
|
||||
|
||||
// If we have explicit width and gravity is FILL we need to be centered otherwise our explicit width won't be taken into account.
|
||||
if (lp.width >= 0 && horizontalGravity == Gravity.FILL_HORIZONTAL) {
|
||||
horizontalGravity = Gravity.CENTER_HORIZONTAL;
|
||||
}
|
||||
|
||||
switch (horizontalGravity) {
|
||||
case Gravity.LEFT:
|
||||
childLeft = left + lp.leftMargin;
|
||||
break;
|
||||
|
||||
case Gravity.CENTER_HORIZONTAL:
|
||||
childLeft = left + (right - left - childWidth + lp.leftMargin - lp.rightMargin) / 2;
|
||||
break;
|
||||
|
||||
case Gravity.RIGHT:
|
||||
childLeft = right - childWidth - lp.rightMargin;
|
||||
break;
|
||||
|
||||
case Gravity.FILL_HORIZONTAL:
|
||||
default:
|
||||
childLeft = left + lp.leftMargin;
|
||||
childWidth = right - left - (lp.leftMargin + lp.rightMargin);
|
||||
break;
|
||||
}
|
||||
|
||||
int childRight = Math.round(childLeft + childWidth);
|
||||
int childBottom = Math.round(childTop + childHeight);
|
||||
childLeft = Math.round(childLeft);
|
||||
childTop = Math.round(childTop);
|
||||
|
||||
// Re-measure TextView because it is not centered if layout width is larger than measure width.
|
||||
if (child instanceof android.widget.TextView) {
|
||||
|
||||
boolean canChangeWidth = lp.width < 0;
|
||||
boolean canChangeHeight = lp.height < 0;
|
||||
|
||||
int measuredWidth = child.getMeasuredWidth();
|
||||
int measuredHeight = child.getMeasuredHeight();
|
||||
|
||||
int width = childRight - childLeft;
|
||||
int height = childBottom - childTop;
|
||||
if ((Math.abs(measuredWidth - width) > 1 && canChangeWidth) || (Math.abs(measuredHeight - height) > 1 && canChangeHeight)) {
|
||||
int widthMeasureSpec = MeasureSpec.makeMeasureSpec(canChangeWidth ? width : lp.width, MeasureSpec.EXACTLY);
|
||||
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(canChangeHeight ? height : lp.height, MeasureSpec.EXACTLY);
|
||||
if (debuggable > 0) {
|
||||
sb.setLength(0);
|
||||
sb.append("remeasure ");
|
||||
sb.append(child);
|
||||
sb.append(" with ");
|
||||
sb.append(MeasureSpec.toString(widthMeasureSpec));
|
||||
sb.append(", ");
|
||||
sb.append(MeasureSpec.toString(heightMeasureSpec));
|
||||
log(TAG, sb.toString());
|
||||
}
|
||||
|
||||
child.measure(widthMeasureSpec, heightMeasureSpec);
|
||||
}
|
||||
}
|
||||
|
||||
if (debuggable > 0) {
|
||||
sb.setLength(0);
|
||||
sb.append(child.getParent().toString());
|
||||
sb.append(" :layoutChild: ");
|
||||
sb.append(child.toString());
|
||||
sb.append(" ");
|
||||
sb.append(childLeft);
|
||||
sb.append(", ");
|
||||
sb.append(childTop);
|
||||
sb.append(", ");
|
||||
sb.append(childRight);
|
||||
sb.append(", ");
|
||||
sb.append(childBottom);
|
||||
log(TAG, sb.toString());
|
||||
}
|
||||
|
||||
child.layout(childLeft, childTop, childRight, childBottom);
|
||||
}
|
||||
|
||||
public static void measureChild(View child, int widthMeasureSpec, int heightMeasureSpec) {
|
||||
if (child.getVisibility() == View.GONE) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Negative means not initialized.
|
||||
if(debuggable < 0) {
|
||||
try {
|
||||
Context context = child.getContext();
|
||||
ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), android.content.pm.PackageManager.GET_META_DATA);
|
||||
android.os.Bundle bundle = ai.metaData;
|
||||
Boolean debugLayouts = bundle != null ? bundle.getBoolean("debugLayouts", false) : false;
|
||||
debuggable = debugLayouts ? 1 : 0;
|
||||
} catch (NameNotFoundException e) {
|
||||
debuggable = 0;
|
||||
Log.e(TAG, "Failed to load meta-data, NameNotFound: " + e.getMessage());
|
||||
} catch (NullPointerException e) {
|
||||
debuggable = 0;
|
||||
Log.e(TAG, "Failed to load meta-data, NullPointer: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
int childWidthMeasureSpec = getMeasureSpec(child, widthMeasureSpec, true);
|
||||
int childHeightMeasureSpec = getMeasureSpec(child, heightMeasureSpec, false);
|
||||
|
||||
if (debuggable > 0) {
|
||||
sb.setLength(0);
|
||||
sb.append(child.getParent().toString());
|
||||
sb.append(" :measureChild: ");
|
||||
sb.append(child.toString());
|
||||
sb.append(" ");
|
||||
sb.append(MeasureSpec.toString(childWidthMeasureSpec));
|
||||
sb.append(", ");
|
||||
sb.append(MeasureSpec.toString(childHeightMeasureSpec));
|
||||
log(TAG, sb.toString());
|
||||
}
|
||||
|
||||
child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
|
||||
}
|
||||
|
||||
public static void updateChildLayoutParams(View child, int widthMeasureSpec, int heightMeasureSpec) {
|
||||
|
||||
int availableWidth = MeasureSpec.getSize(widthMeasureSpec);
|
||||
int widthSpec = MeasureSpec.getMode(widthMeasureSpec);
|
||||
|
||||
int availableHeight = MeasureSpec.getSize(heightMeasureSpec);
|
||||
int heightSpec = MeasureSpec.getMode(heightMeasureSpec);
|
||||
|
||||
CommonLayoutParams lp = (CommonLayoutParams)child.getLayoutParams();
|
||||
if (widthSpec != MeasureSpec.UNSPECIFIED) {
|
||||
if (lp.widthPercent > 0) {
|
||||
lp.width = (int)(availableWidth * lp.widthPercent);
|
||||
}
|
||||
|
||||
if (lp.leftMarginPercent > 0) {
|
||||
lp.leftMargin = (int)(availableWidth * lp.leftMarginPercent);
|
||||
}
|
||||
|
||||
if (lp.rightMarginPercent > 0) {
|
||||
lp.rightMargin = (int)(availableWidth * lp.rightMarginPercent);
|
||||
}
|
||||
}
|
||||
|
||||
if (heightSpec != MeasureSpec.UNSPECIFIED) {
|
||||
if (lp.heightPercent > 0) {
|
||||
lp.height = (int)(availableHeight * lp.heightPercent);
|
||||
}
|
||||
|
||||
if (lp.topMarginPercent > 0) {
|
||||
lp.topMargin = (int)(availableHeight * lp.topMarginPercent);
|
||||
}
|
||||
|
||||
if (lp.bottomMarginPercent > 0) {
|
||||
lp.bottomMargin = (int)(availableHeight * lp.bottomMarginPercent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void log(String tag, String message) {
|
||||
Log.d(tag, message);
|
||||
}
|
||||
|
||||
static StringBuilder getStringBuilder() {
|
||||
sb.setLength(0);
|
||||
return sb;
|
||||
}
|
||||
|
||||
private static int getMeasureSpec(View view, int parentMeasureSpec, boolean horizontal) {
|
||||
|
||||
int parentLength = MeasureSpec.getSize(parentMeasureSpec);
|
||||
int parentSpecMode = MeasureSpec.getMode(parentMeasureSpec);
|
||||
|
||||
CommonLayoutParams lp = (CommonLayoutParams)view.getLayoutParams();
|
||||
final int margins = horizontal ? lp.leftMargin + lp.rightMargin : lp.topMargin + lp.bottomMargin;
|
||||
|
||||
int resultSize = 0;
|
||||
int resultMode = 0;
|
||||
|
||||
int measureLength = Math.max(0, parentLength - margins);
|
||||
int childLength = horizontal ? lp.width : lp.height;
|
||||
|
||||
// We want a specific size... let be it.
|
||||
if (childLength >= 0) {
|
||||
if (parentSpecMode != MeasureSpec.UNSPECIFIED) {
|
||||
resultSize = Math.min(parentLength, childLength);
|
||||
}
|
||||
else {
|
||||
resultSize = childLength;
|
||||
}
|
||||
|
||||
resultMode = MeasureSpec.EXACTLY;
|
||||
}
|
||||
else {
|
||||
switch (parentSpecMode) {
|
||||
// Parent has imposed an exact size on us
|
||||
case MeasureSpec.EXACTLY:
|
||||
resultSize = measureLength;
|
||||
int gravity = LayoutBase.getGravity(view);
|
||||
boolean stretched;
|
||||
if (horizontal) {
|
||||
final int horizontalGravity = Gravity.getAbsoluteGravity(gravity, view.getLayoutDirection()) & Gravity.HORIZONTAL_GRAVITY_MASK;
|
||||
stretched = horizontalGravity == Gravity.FILL_HORIZONTAL;
|
||||
}
|
||||
else {
|
||||
final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK;
|
||||
stretched = verticalGravity == Gravity.FILL_VERTICAL;
|
||||
}
|
||||
|
||||
// if stretched - view wants to be our size. So be it.
|
||||
// else - view wants to determine its own size. It can't be bigger than us.
|
||||
resultMode = stretched ? MeasureSpec.EXACTLY : MeasureSpec.AT_MOST;
|
||||
break;
|
||||
|
||||
// Parent has imposed a maximum size on us
|
||||
case MeasureSpec.AT_MOST:
|
||||
resultSize = measureLength;
|
||||
resultMode = MeasureSpec.AT_MOST;
|
||||
break;
|
||||
|
||||
case MeasureSpec.UNSPECIFIED:
|
||||
resultSize = 0;
|
||||
resultMode = MeasureSpec.UNSPECIFIED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return MeasureSpec.makeMeasureSpec(resultSize, resultMode);
|
||||
}
|
||||
}
|
||||
22
widgets/build.gradle
Normal file
22
widgets/build.gradle
Normal file
@@ -0,0 +1,22 @@
|
||||
apply plugin: 'com.android.library'
|
||||
|
||||
android {
|
||||
compileSdkVersion 17
|
||||
buildToolsVersion "23.0.1"
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 17
|
||||
targetSdkVersion 21
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile 'com.android.support:support-v4:23.0.1'
|
||||
}
|
||||
@@ -18,7 +18,8 @@ public class AbsoluteLayout extends LayoutBase {
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
|
||||
CommonLayoutParams.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
int measureWidth = 0;
|
||||
int measureHeight = 0;
|
||||
int childMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
|
||||
@@ -29,8 +30,7 @@ public class AbsoluteLayout extends LayoutBase {
|
||||
if (child.getVisibility() == View.GONE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
CommonLayoutParams.updateChildLayoutParams(child, widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
CommonLayoutParams.measureChild(child, childMeasureSpec, childMeasureSpec);
|
||||
final int childMeasuredWidth = CommonLayoutParams.getDesiredWidth(child);
|
||||
final int childMeasuredHeight = CommonLayoutParams.getDesiredHeight(child);
|
||||
@@ -56,7 +56,6 @@ public class AbsoluteLayout extends LayoutBase {
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||
|
||||
int leftPadding = this.getPaddingLeft();
|
||||
int topPadding = this.getPaddingTop();
|
||||
int count = this.getChildCount();
|
||||
@@ -78,5 +77,7 @@ public class AbsoluteLayout extends LayoutBase {
|
||||
|
||||
CommonLayoutParams.layoutChild(child, childLeft, childTop, childRight, childBottom);
|
||||
}
|
||||
|
||||
CommonLayoutParams.restoreOriginalParams(this);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,407 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package org.nativescript.widgets;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager.NameNotFoundException;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.View.MeasureSpec;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewGroup.LayoutParams;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
/**
|
||||
* @author hhristov
|
||||
*/
|
||||
public class CommonLayoutParams extends FrameLayout.LayoutParams {
|
||||
|
||||
static final String TAG = "NSLayout";
|
||||
static int debuggable = -1;
|
||||
private static final StringBuilder sb = new StringBuilder();
|
||||
|
||||
public CommonLayoutParams() {
|
||||
super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
|
||||
}
|
||||
|
||||
public float widthPercent = 0;
|
||||
public float heightPercent = 0;
|
||||
|
||||
public float topMarginPercent = 0;
|
||||
public float leftMarginPercent = 0;
|
||||
public float bottomMarginPercent = 0;
|
||||
public float rightMarginPercent = 0;
|
||||
|
||||
public int widthOriginal = -1;
|
||||
public int heightOriginal = -1;
|
||||
|
||||
public int topMarginOriginal = -1;
|
||||
public int leftMarginOriginal = -1;
|
||||
public int bottomMarginOriginal = -1;
|
||||
public int rightMarginOriginal = -1;
|
||||
|
||||
public int left = 0;
|
||||
public int top = 0;
|
||||
public int row = 0;
|
||||
public int column = 0;
|
||||
public int rowSpan = 1;
|
||||
public int columnSpan = 1;
|
||||
public Dock dock = Dock.left;
|
||||
|
||||
protected static int getDesiredWidth(View view) {
|
||||
CommonLayoutParams lp = (CommonLayoutParams) view.getLayoutParams();
|
||||
return view.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;
|
||||
}
|
||||
|
||||
protected static int getDesiredHeight(View view) {
|
||||
CommonLayoutParams lp = (CommonLayoutParams) view.getLayoutParams();
|
||||
return view.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
|
||||
}
|
||||
|
||||
// We use our own layout method because the one in FrameLayout is broken when margins are set and gravity is CENTER_VERTICAL or CENTER_HORIZONTAL.
|
||||
@SuppressLint("RtlHardcoded")
|
||||
protected static void layoutChild(View child, int left, int top, int right, int bottom) {
|
||||
if (child.getVisibility() == View.GONE) {
|
||||
return;
|
||||
}
|
||||
|
||||
int childTop = 0;
|
||||
int childLeft = 0;
|
||||
|
||||
int childWidth = child.getMeasuredWidth();
|
||||
int childHeight = child.getMeasuredHeight();
|
||||
|
||||
CommonLayoutParams lp = (CommonLayoutParams) child.getLayoutParams();
|
||||
int gravity = lp.gravity;
|
||||
if (gravity == -1) {
|
||||
gravity = Gravity.FILL;
|
||||
}
|
||||
|
||||
int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK;
|
||||
|
||||
// If we have explicit height and gravity is FILL we need to be centered otherwise our explicit height won't be taken into account.
|
||||
if (lp.height >= 0 && verticalGravity == Gravity.FILL_VERTICAL) {
|
||||
verticalGravity = Gravity.CENTER_VERTICAL;
|
||||
}
|
||||
|
||||
switch (verticalGravity) {
|
||||
case Gravity.TOP:
|
||||
childTop = top + lp.topMargin;
|
||||
break;
|
||||
|
||||
case Gravity.CENTER_VERTICAL:
|
||||
childTop = top + (bottom - top - childHeight + lp.topMargin - lp.bottomMargin) / 2;
|
||||
break;
|
||||
|
||||
case Gravity.BOTTOM:
|
||||
childTop = bottom - childHeight - lp.bottomMargin;
|
||||
break;
|
||||
|
||||
case Gravity.FILL_VERTICAL:
|
||||
default:
|
||||
childTop = top + lp.topMargin;
|
||||
childHeight = bottom - top - (lp.topMargin + lp.bottomMargin);
|
||||
break;
|
||||
}
|
||||
|
||||
int horizontalGravity = Gravity.getAbsoluteGravity(gravity, child.getLayoutDirection()) & Gravity.HORIZONTAL_GRAVITY_MASK;
|
||||
|
||||
// If we have explicit width and gravity is FILL we need to be centered otherwise our explicit width won't be taken into account.
|
||||
if (lp.width >= 0 && horizontalGravity == Gravity.FILL_HORIZONTAL) {
|
||||
horizontalGravity = Gravity.CENTER_HORIZONTAL;
|
||||
}
|
||||
|
||||
switch (horizontalGravity) {
|
||||
case Gravity.LEFT:
|
||||
childLeft = left + lp.leftMargin;
|
||||
break;
|
||||
|
||||
case Gravity.CENTER_HORIZONTAL:
|
||||
childLeft = left + (right - left - childWidth + lp.leftMargin - lp.rightMargin) / 2;
|
||||
break;
|
||||
|
||||
case Gravity.RIGHT:
|
||||
childLeft = right - childWidth - lp.rightMargin;
|
||||
break;
|
||||
|
||||
case Gravity.FILL_HORIZONTAL:
|
||||
default:
|
||||
childLeft = left + lp.leftMargin;
|
||||
childWidth = right - left - (lp.leftMargin + lp.rightMargin);
|
||||
break;
|
||||
}
|
||||
|
||||
int childRight = Math.round(childLeft + childWidth);
|
||||
int childBottom = Math.round(childTop + childHeight);
|
||||
childLeft = Math.round(childLeft);
|
||||
childTop = Math.round(childTop);
|
||||
|
||||
// Re-measure TextView because it is not centered if layout width is larger than measure width.
|
||||
if (child instanceof android.widget.TextView) {
|
||||
|
||||
boolean canChangeWidth = lp.width < 0;
|
||||
boolean canChangeHeight = lp.height < 0;
|
||||
|
||||
int measuredWidth = child.getMeasuredWidth();
|
||||
int measuredHeight = child.getMeasuredHeight();
|
||||
|
||||
int width = childRight - childLeft;
|
||||
int height = childBottom - childTop;
|
||||
if ((Math.abs(measuredWidth - width) > 1 && canChangeWidth) || (Math.abs(measuredHeight - height) > 1 && canChangeHeight)) {
|
||||
int widthMeasureSpec = MeasureSpec.makeMeasureSpec(canChangeWidth ? width : lp.width, MeasureSpec.EXACTLY);
|
||||
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(canChangeHeight ? height : lp.height, MeasureSpec.EXACTLY);
|
||||
if (debuggable > 0) {
|
||||
sb.setLength(0);
|
||||
sb.append("remeasure ");
|
||||
sb.append(child);
|
||||
sb.append(" with ");
|
||||
sb.append(MeasureSpec.toString(widthMeasureSpec));
|
||||
sb.append(", ");
|
||||
sb.append(MeasureSpec.toString(heightMeasureSpec));
|
||||
log(TAG, sb.toString());
|
||||
}
|
||||
|
||||
child.measure(widthMeasureSpec, heightMeasureSpec);
|
||||
}
|
||||
}
|
||||
|
||||
if (debuggable > 0) {
|
||||
sb.setLength(0);
|
||||
sb.append(child.getParent().toString());
|
||||
sb.append(" :layoutChild: ");
|
||||
sb.append(child.toString());
|
||||
sb.append(" ");
|
||||
sb.append(childLeft);
|
||||
sb.append(", ");
|
||||
sb.append(childTop);
|
||||
sb.append(", ");
|
||||
sb.append(childRight);
|
||||
sb.append(", ");
|
||||
sb.append(childBottom);
|
||||
log(TAG, sb.toString());
|
||||
}
|
||||
|
||||
child.layout(childLeft, childTop, childRight, childBottom);
|
||||
}
|
||||
|
||||
protected static void measureChild(View child, int widthMeasureSpec, int heightMeasureSpec) {
|
||||
if (child.getVisibility() == View.GONE) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Negative means not initialized.
|
||||
if (debuggable < 0) {
|
||||
try {
|
||||
Context context = child.getContext();
|
||||
ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), android.content.pm.PackageManager.GET_META_DATA);
|
||||
android.os.Bundle bundle = ai.metaData;
|
||||
Boolean debugLayouts = bundle != null ? bundle.getBoolean("debugLayouts", false) : false;
|
||||
debuggable = debugLayouts ? 1 : 0;
|
||||
} catch (NameNotFoundException e) {
|
||||
debuggable = 0;
|
||||
Log.e(TAG, "Failed to load meta-data, NameNotFound: " + e.getMessage());
|
||||
} catch (NullPointerException e) {
|
||||
debuggable = 0;
|
||||
Log.e(TAG, "Failed to load meta-data, NullPointer: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
int childWidthMeasureSpec = getMeasureSpec(child, widthMeasureSpec, true);
|
||||
int childHeightMeasureSpec = getMeasureSpec(child, heightMeasureSpec, false);
|
||||
|
||||
if (debuggable > 0) {
|
||||
sb.setLength(0);
|
||||
sb.append(child.getParent().toString());
|
||||
sb.append(" :measureChild: ");
|
||||
sb.append(child.toString());
|
||||
sb.append(" ");
|
||||
sb.append(MeasureSpec.toString(childWidthMeasureSpec));
|
||||
sb.append(", ");
|
||||
sb.append(MeasureSpec.toString(childHeightMeasureSpec));
|
||||
log(TAG, sb.toString());
|
||||
}
|
||||
|
||||
child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterates over children and changes their width and height to one calculated from percentage
|
||||
* values.
|
||||
*
|
||||
* @param viewGroup The parent ViewGroup.
|
||||
* @param widthMeasureSpec Width MeasureSpec of the parent ViewGroup.
|
||||
* @param heightMeasureSpec Height MeasureSpec of the parent ViewGroup.
|
||||
*/
|
||||
protected static void adjustChildrenLayoutParams(ViewGroup viewGroup, int widthMeasureSpec, int heightMeasureSpec) {
|
||||
|
||||
int availableWidth = MeasureSpec.getSize(widthMeasureSpec);
|
||||
int widthSpec = MeasureSpec.getMode(widthMeasureSpec);
|
||||
|
||||
int availableHeight = MeasureSpec.getSize(heightMeasureSpec);
|
||||
int heightSpec = MeasureSpec.getMode(heightMeasureSpec);
|
||||
|
||||
for (int i = 0, count = viewGroup.getChildCount(); i < count; i++) {
|
||||
View child = viewGroup.getChildAt(i);
|
||||
ViewGroup.LayoutParams params = child.getLayoutParams();
|
||||
|
||||
if (params instanceof CommonLayoutParams) {
|
||||
CommonLayoutParams lp = (CommonLayoutParams) child.getLayoutParams();
|
||||
if (widthSpec != MeasureSpec.UNSPECIFIED) {
|
||||
if (lp.widthPercent > 0) {
|
||||
lp.widthOriginal = lp.width;
|
||||
lp.width = (int) (availableWidth * lp.widthPercent);
|
||||
}
|
||||
else {
|
||||
lp.widthOriginal = -1;
|
||||
}
|
||||
|
||||
if (lp.leftMarginPercent > 0) {
|
||||
lp.leftMarginOriginal = lp.leftMargin;
|
||||
lp.leftMargin = (int) (availableWidth * lp.leftMarginPercent);
|
||||
}
|
||||
else {
|
||||
lp.leftMarginOriginal = -1;
|
||||
}
|
||||
|
||||
if (lp.rightMarginPercent > 0) {
|
||||
lp.rightMarginOriginal = lp.rightMargin;
|
||||
lp.rightMargin = (int) (availableWidth * lp.rightMarginPercent);
|
||||
}
|
||||
else {
|
||||
lp.rightMarginOriginal = -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (heightSpec != MeasureSpec.UNSPECIFIED) {
|
||||
if (lp.heightPercent > 0) {
|
||||
lp.heightOriginal = lp.height;
|
||||
lp.height = (int) (availableHeight * lp.heightPercent);
|
||||
}
|
||||
else {
|
||||
lp.heightOriginal = -1;
|
||||
}
|
||||
|
||||
if (lp.topMarginPercent > 0) {
|
||||
lp.topMarginOriginal = lp.topMargin;
|
||||
lp.topMargin = (int) (availableHeight * lp.topMarginPercent);
|
||||
}
|
||||
else {
|
||||
lp.topMarginOriginal = -1;
|
||||
}
|
||||
|
||||
if (lp.bottomMarginPercent > 0) {
|
||||
lp.bottomMarginOriginal = lp.bottomMargin;
|
||||
lp.bottomMargin = (int) (availableHeight * lp.bottomMarginPercent);
|
||||
}
|
||||
else {
|
||||
lp.bottomMarginOriginal = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterates over children and restores their original dimensions that were changed for
|
||||
* percentage values.
|
||||
*/
|
||||
protected static void restoreOriginalParams(ViewGroup viewGroup) {
|
||||
for (int i = 0, count = viewGroup.getChildCount(); i < count; i++) {
|
||||
View view = viewGroup.getChildAt(i);
|
||||
ViewGroup.LayoutParams params = view.getLayoutParams();
|
||||
if (params instanceof CommonLayoutParams) {
|
||||
CommonLayoutParams lp = (CommonLayoutParams) params;
|
||||
if (lp.widthPercent > 0) {
|
||||
lp.width = lp.widthOriginal;
|
||||
}
|
||||
if (lp.heightPercent > 0) {
|
||||
lp.height = lp.heightOriginal;
|
||||
}
|
||||
if (lp.leftMarginPercent > 0) {
|
||||
lp.leftMargin = lp.leftMarginOriginal;
|
||||
}
|
||||
if (lp.topMarginPercent > 0) {
|
||||
lp.topMargin = lp.topMarginOriginal;
|
||||
}
|
||||
if (lp.rightMarginPercent > 0) {
|
||||
lp.rightMargin = lp.rightMarginOriginal;
|
||||
}
|
||||
if (lp.bottomMarginPercent > 0) {
|
||||
lp.bottomMargin = lp.bottomMarginOriginal;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void log(String tag, String message) {
|
||||
Log.d(tag, message);
|
||||
}
|
||||
|
||||
static StringBuilder getStringBuilder() {
|
||||
sb.setLength(0);
|
||||
return sb;
|
||||
}
|
||||
|
||||
private static int getMeasureSpec(View view, int parentMeasureSpec, boolean horizontal) {
|
||||
|
||||
int parentLength = MeasureSpec.getSize(parentMeasureSpec);
|
||||
int parentSpecMode = MeasureSpec.getMode(parentMeasureSpec);
|
||||
|
||||
CommonLayoutParams lp = (CommonLayoutParams) view.getLayoutParams();
|
||||
final int margins = horizontal ? lp.leftMargin + lp.rightMargin : lp.topMargin + lp.bottomMargin;
|
||||
|
||||
int resultSize = 0;
|
||||
int resultMode = MeasureSpec.UNSPECIFIED;
|
||||
|
||||
int measureLength = Math.max(0, parentLength - margins);
|
||||
int childLength = horizontal ? lp.width : lp.height;
|
||||
|
||||
// We want a specific size... let be it.
|
||||
if (childLength >= 0) {
|
||||
if (parentSpecMode != MeasureSpec.UNSPECIFIED) {
|
||||
resultSize = Math.min(parentLength, childLength);
|
||||
} else {
|
||||
resultSize = childLength;
|
||||
}
|
||||
|
||||
resultMode = MeasureSpec.EXACTLY;
|
||||
} else {
|
||||
switch (parentSpecMode) {
|
||||
// Parent has imposed an exact size on us
|
||||
case MeasureSpec.EXACTLY:
|
||||
resultSize = measureLength;
|
||||
int gravity = LayoutBase.getGravity(view);
|
||||
boolean stretched;
|
||||
if (horizontal) {
|
||||
final int horizontalGravity = Gravity.getAbsoluteGravity(gravity, view.getLayoutDirection()) & Gravity.HORIZONTAL_GRAVITY_MASK;
|
||||
stretched = horizontalGravity == Gravity.FILL_HORIZONTAL;
|
||||
} else {
|
||||
final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK;
|
||||
stretched = verticalGravity == Gravity.FILL_VERTICAL;
|
||||
}
|
||||
|
||||
// if stretched - view wants to be our size. So be it.
|
||||
// else - view wants to determine its own size. It can't be bigger than us.
|
||||
resultMode = stretched ? MeasureSpec.EXACTLY : MeasureSpec.AT_MOST;
|
||||
break;
|
||||
|
||||
// Parent has imposed a maximum size on us
|
||||
case MeasureSpec.AT_MOST:
|
||||
resultSize = measureLength;
|
||||
resultMode = MeasureSpec.AT_MOST;
|
||||
break;
|
||||
|
||||
case MeasureSpec.UNSPECIFIED:
|
||||
resultSize = 0;
|
||||
resultMode = MeasureSpec.UNSPECIFIED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return MeasureSpec.makeMeasureSpec(resultSize, resultMode);
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,8 @@ public class ContentLayout extends LayoutBase {
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
|
||||
CommonLayoutParams.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
int measureWidth = 0;
|
||||
int measureHeight = 0;
|
||||
|
||||
@@ -29,7 +30,6 @@ public class ContentLayout extends LayoutBase {
|
||||
continue;
|
||||
}
|
||||
|
||||
CommonLayoutParams.updateChildLayoutParams(child, widthMeasureSpec, heightMeasureSpec);
|
||||
CommonLayoutParams.measureChild(child, widthMeasureSpec, heightMeasureSpec);
|
||||
final int childMeasuredWidth = CommonLayoutParams.getDesiredWidth(child);
|
||||
final int childMeasuredHeight = CommonLayoutParams.getDesiredHeight(child);
|
||||
@@ -54,7 +54,6 @@ public class ContentLayout extends LayoutBase {
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||
|
||||
int paddingLeft = this.getPaddingLeft();
|
||||
int paddingRight = this.getPaddingRight();
|
||||
int paddingTop = this.getPaddingTop();
|
||||
@@ -75,5 +74,7 @@ public class ContentLayout extends LayoutBase {
|
||||
|
||||
CommonLayoutParams.layoutChild(child, childLeft, childTop, childRight, childBottom);
|
||||
}
|
||||
|
||||
CommonLayoutParams.restoreOriginalParams(this);
|
||||
}
|
||||
}
|
||||
@@ -27,6 +27,7 @@ public class DockLayout extends LayoutBase {
|
||||
}
|
||||
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
CommonLayoutParams.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
int measureWidth = 0;
|
||||
int measureHeight = 0;
|
||||
@@ -64,7 +65,6 @@ public class DockLayout extends LayoutBase {
|
||||
childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(remainingHeight, heightMode == MeasureSpec.EXACTLY ? MeasureSpec.AT_MOST : heightMode);
|
||||
}
|
||||
|
||||
CommonLayoutParams.updateChildLayoutParams(child, widthMeasureSpec, heightMeasureSpec);
|
||||
CommonLayoutParams.measureChild(child, childWidthMeasureSpec, childHeightMeasureSpec);
|
||||
final int childMeasuredWidth = CommonLayoutParams.getDesiredWidth(child);
|
||||
final int childMeasuredHeight = CommonLayoutParams.getDesiredHeight(child);
|
||||
@@ -107,7 +107,6 @@ public class DockLayout extends LayoutBase {
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||
|
||||
int childLeft = this.getPaddingLeft();
|
||||
int childTop = this.getPaddingTop();
|
||||
|
||||
@@ -173,5 +172,7 @@ public class DockLayout extends LayoutBase {
|
||||
if (childToStretch != null) {
|
||||
CommonLayoutParams.layoutChild(childToStretch, x, y, x + remainingWidth, y + remainingHeight);
|
||||
}
|
||||
|
||||
CommonLayoutParams.restoreOriginalParams(this);
|
||||
}
|
||||
}
|
||||
@@ -232,8 +232,9 @@ public class GridLayout extends LayoutBase {
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
CommonLayoutParams.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
int measureWidth = 0;
|
||||
int measureWidth = 0;
|
||||
int measureHeight = 0;
|
||||
|
||||
int width = View.MeasureSpec.getSize(widthMeasureSpec);
|
||||
@@ -251,7 +252,7 @@ public class GridLayout extends LayoutBase {
|
||||
this.helper.width = width - horizontalPadding;
|
||||
this.helper.height = height - verticalPadding;
|
||||
|
||||
int gravity = getGravity(this);
|
||||
int gravity = LayoutBase.getGravity(this);
|
||||
int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK;
|
||||
final int layoutDirection = this.getLayoutDirection();
|
||||
final int horizontalGravity = Gravity.getAbsoluteGravity(gravity, layoutDirection) & Gravity.HORIZONTAL_GRAVITY_MASK;
|
||||
@@ -272,7 +273,6 @@ public class GridLayout extends LayoutBase {
|
||||
continue;
|
||||
}
|
||||
|
||||
CommonLayoutParams.updateChildLayoutParams(child, widthMeasureSpec, heightMeasureSpec);
|
||||
MeasureSpecs measureSpecs = this.map.get(child);
|
||||
this.updateMeasureSpecs(child, measureSpecs);
|
||||
this.helper.addMeasureSpec(measureSpecs);
|
||||
@@ -296,7 +296,6 @@ public class GridLayout extends LayoutBase {
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
||||
|
||||
int paddingLeft = this.getPaddingLeft();
|
||||
int paddingTop = this.getPaddingTop();
|
||||
|
||||
@@ -356,6 +355,8 @@ public class GridLayout extends LayoutBase {
|
||||
CommonLayoutParams.layoutChild(measureSpec.child, childLeft, childTop, childRight, childBottom);
|
||||
}
|
||||
}
|
||||
|
||||
CommonLayoutParams.restoreOriginalParams(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,7 +65,9 @@ public class HorizontalScrollView extends android.widget.HorizontalScrollView {
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
// Don't call measure because it will measure content twice.
|
||||
CommonLayoutParams.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
// Don't call measure because it will measure content twice.
|
||||
// ScrollView is expected to have single child so we measure only the first child.
|
||||
View child = this.getChildCount() > 0 ? this.getChildAt(0) : null;
|
||||
if (child == null) {
|
||||
@@ -74,7 +76,6 @@ public class HorizontalScrollView extends android.widget.HorizontalScrollView {
|
||||
this.contentMeasuredHeight = 0;
|
||||
}
|
||||
else {
|
||||
CommonLayoutParams.updateChildLayoutParams(child, widthMeasureSpec, heightMeasureSpec);
|
||||
CommonLayoutParams.measureChild(child, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), heightMeasureSpec);
|
||||
this.contentMeasuredWidth = CommonLayoutParams.getDesiredWidth(child);
|
||||
this.contentMeasuredHeight = CommonLayoutParams.getDesiredHeight(child);
|
||||
@@ -86,8 +87,8 @@ public class HorizontalScrollView extends android.widget.HorizontalScrollView {
|
||||
|
||||
// Don't add in our paddings because they are already added as child margins. (we will include them twice if we add them).
|
||||
// Check the previous line - this.setPadding(lp.leftMargin, lp.topMargin, lp.rightMargin, lp.bottomMargin);
|
||||
// this.contentMeasuredWidth += this.getPaddingLeft() + this.getPaddingRight();
|
||||
// this.contentMeasuredHeight += this.getPaddingTop() + this.getPaddingBottom();
|
||||
//this.contentMeasuredWidth += this.getPaddingLeft() + this.getPaddingRight();
|
||||
//this.contentMeasuredHeight += this.getPaddingTop() + this.getPaddingBottom();
|
||||
|
||||
// Check against our minimum height
|
||||
this.contentMeasuredWidth = Math.max(this.contentMeasuredWidth, this.getSuggestedMinimumWidth());
|
||||
@@ -147,6 +148,7 @@ public class HorizontalScrollView extends android.widget.HorizontalScrollView {
|
||||
|
||||
// Calling this with the present values causes it to re-claim them
|
||||
this.scrollTo(scrollX, scrollY);
|
||||
CommonLayoutParams.restoreOriginalParams(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -31,7 +31,9 @@ public class StackLayout extends LayoutBase {
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
int childState = 0;
|
||||
CommonLayoutParams.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
int childState = 0;
|
||||
int measureWidth = 0;
|
||||
int measureHeight = 0;
|
||||
|
||||
@@ -77,7 +79,6 @@ public class StackLayout extends LayoutBase {
|
||||
continue;
|
||||
}
|
||||
|
||||
CommonLayoutParams.updateChildLayoutParams(child, widthMeasureSpec, heightMeasureSpec);
|
||||
if (isVertical) {
|
||||
CommonLayoutParams.measureChild(child, childMeasureSpec, MeasureSpec.makeMeasureSpec(remainingLength, measureSpecMode));
|
||||
final int childMeasuredWidth = CommonLayoutParams.getDesiredWidth(child);
|
||||
@@ -118,13 +119,14 @@ public class StackLayout extends LayoutBase {
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
||||
|
||||
if (this._orientation == Orientation.vertical) {
|
||||
this.layoutVertical(l, t, r, b);
|
||||
}
|
||||
else {
|
||||
this.layoutHorizontal(l, t, r, b);
|
||||
}
|
||||
|
||||
CommonLayoutParams.restoreOriginalParams(this);
|
||||
}
|
||||
|
||||
private void layoutVertical(int left, int top, int right, int bottom) {
|
||||
@@ -138,7 +140,7 @@ public class StackLayout extends LayoutBase {
|
||||
int childLeft = paddingLeft;
|
||||
int childRight = right - left - paddingRight;
|
||||
|
||||
int gravity = getGravity(this);
|
||||
int gravity = LayoutBase.getGravity(this);
|
||||
final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK;
|
||||
|
||||
switch (verticalGravity) {
|
||||
@@ -164,8 +166,7 @@ public class StackLayout extends LayoutBase {
|
||||
continue;
|
||||
}
|
||||
|
||||
CommonLayoutParams childLayoutParams = (CommonLayoutParams)child.getLayoutParams();
|
||||
int childHeight = child.getMeasuredHeight() + childLayoutParams.topMargin + childLayoutParams.bottomMargin;
|
||||
int childHeight = CommonLayoutParams.getDesiredHeight(child);
|
||||
CommonLayoutParams.layoutChild(child, childLeft, childTop, childRight, childTop + childHeight);
|
||||
childTop += childHeight;
|
||||
}
|
||||
@@ -183,7 +184,7 @@ public class StackLayout extends LayoutBase {
|
||||
int childLeft = 0;
|
||||
int childBottom = bottom - top - paddingBottom;
|
||||
|
||||
int gravity = getGravity(this);
|
||||
int gravity = LayoutBase.getGravity(this);
|
||||
final int horizontalGravity = Gravity.getAbsoluteGravity(gravity, this.getLayoutDirection()) & Gravity.HORIZONTAL_GRAVITY_MASK;
|
||||
|
||||
switch (horizontalGravity) {
|
||||
@@ -209,8 +210,7 @@ public class StackLayout extends LayoutBase {
|
||||
continue;
|
||||
}
|
||||
|
||||
CommonLayoutParams childLayoutParams = (CommonLayoutParams)child.getLayoutParams();
|
||||
int childWidth = child.getMeasuredWidth() + childLayoutParams.leftMargin + childLayoutParams.rightMargin;
|
||||
int childWidth = CommonLayoutParams.getDesiredWidth(child);
|
||||
CommonLayoutParams.layoutChild(child, childLeft, childTop, childLeft + childWidth, childBottom);
|
||||
childLeft += childWidth;
|
||||
}
|
||||
@@ -27,7 +27,7 @@ import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
class TabStrip extends LinearLayout {
|
||||
|
||||
|
||||
private static final int DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS = 0;
|
||||
private static final byte DEFAULT_BOTTOM_BORDER_COLOR_ALPHA = 0x26;
|
||||
private static final int SELECTED_INDICATOR_THICKNESS_DIPS = 3;
|
||||
@@ -53,13 +53,14 @@ class TabStrip extends LinearLayout {
|
||||
|
||||
TabStrip(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
|
||||
setWillNotDraw(false);
|
||||
|
||||
final float density = getResources().getDisplayMetrics().density;
|
||||
|
||||
TypedValue outValue = new TypedValue();
|
||||
context.getTheme().resolveAttribute(android.R.attr.colorForeground, outValue, true);
|
||||
final int themeForegroundColor = outValue.data;
|
||||
final int themeForegroundColor = outValue.data;
|
||||
|
||||
mDefaultBottomBorderColor = setColorAlpha(themeForegroundColor,
|
||||
DEFAULT_BOTTOM_BORDER_COLOR_ALPHA);
|
||||
@@ -65,7 +65,9 @@ public class VerticalScrollView extends ScrollView {
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
// Don't call measure because it will measure content twice.
|
||||
CommonLayoutParams.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
// Don't call measure because it will measure content twice.
|
||||
// ScrollView is expected to have single child so we measure only the first child.
|
||||
View child = this.getChildCount() > 0 ? this.getChildAt(0) : null;
|
||||
if (child == null) {
|
||||
@@ -75,7 +77,6 @@ public class VerticalScrollView extends ScrollView {
|
||||
this.setPadding(0, 0, 0, 0);
|
||||
}
|
||||
else {
|
||||
CommonLayoutParams.updateChildLayoutParams(child, widthMeasureSpec, heightMeasureSpec);
|
||||
CommonLayoutParams.measureChild(child, widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
|
||||
this.contentMeasuredWidth = CommonLayoutParams.getDesiredWidth(child);
|
||||
this.contentMeasuredHeight = CommonLayoutParams.getDesiredHeight(child);
|
||||
@@ -144,6 +145,8 @@ public class VerticalScrollView extends ScrollView {
|
||||
|
||||
// Calling this with the present values causes it to re-claim them
|
||||
this.scrollTo(scrollX, scrollY);
|
||||
|
||||
CommonLayoutParams.restoreOriginalParams(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -60,8 +60,9 @@ public class WrapLayout extends LayoutBase {
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
|
||||
int measureWidth = 0;
|
||||
CommonLayoutParams.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
int measureWidth = 0;
|
||||
int measureHeight = 0;
|
||||
|
||||
int width = MeasureSpec.getSize(widthMeasureSpec);
|
||||
@@ -91,8 +92,7 @@ public class WrapLayout extends LayoutBase {
|
||||
if (child.getVisibility() == View.GONE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
CommonLayoutParams.updateChildLayoutParams(child, widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
CommonLayoutParams.measureChild(child, childWidthMeasureSpec, childHeightMeasureSpec);
|
||||
final int childMeasuredWidth = CommonLayoutParams.getDesiredWidth(child);
|
||||
final int childMeasuredHeight = CommonLayoutParams.getDesiredHeight(child);
|
||||
@@ -162,7 +162,6 @@ public class WrapLayout extends LayoutBase {
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||
|
||||
boolean isVertical = this._orientation == Orientation.vertical;
|
||||
int paddingLeft = this.getPaddingLeft();
|
||||
int paddingRight = this.getPaddingRight();
|
||||
@@ -187,7 +186,6 @@ public class WrapLayout extends LayoutBase {
|
||||
|
||||
int length = this._lengths.get(rowOrColumn);
|
||||
if (isVertical) {
|
||||
|
||||
childWidth = length;
|
||||
childHeight = this._itemHeight > 0 ? this._itemHeight : childHeight;
|
||||
if (childTop + childHeight > childrenLength) {
|
||||
@@ -233,5 +231,7 @@ public class WrapLayout extends LayoutBase {
|
||||
childLeft += childWidth;
|
||||
}
|
||||
}
|
||||
|
||||
CommonLayoutParams.restoreOriginalParams(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
88
widgets/widgets.iml
Normal file
88
widgets/widgets.iml
Normal file
@@ -0,0 +1,88 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id=":widgets" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="android-widgets" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="android-gradle" name="Android-Gradle">
|
||||
<configuration>
|
||||
<option name="GRADLE_PROJECT_PATH" value=":widgets" />
|
||||
</configuration>
|
||||
</facet>
|
||||
<facet type="android" name="Android">
|
||||
<configuration>
|
||||
<option name="SELECTED_BUILD_VARIANT" value="debug" />
|
||||
<option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
|
||||
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
|
||||
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
|
||||
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugAndroidTest" />
|
||||
<option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileDebugAndroidTestSources" />
|
||||
<afterSyncTasks>
|
||||
<task>generateDebugAndroidTestSources</task>
|
||||
<task>generateDebugSources</task>
|
||||
</afterSyncTasks>
|
||||
<option name="ALLOW_USER_CONFIGURATION" value="false" />
|
||||
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
|
||||
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
|
||||
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
|
||||
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
|
||||
<option name="LIBRARY_PROJECT" value="true" />
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="false">
|
||||
<output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
|
||||
<output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/debug" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotations" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/23.0.1/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Android API 17 Platform" jdkType="Android SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" exported="" name="support-v4-23.0.1" level="project" />
|
||||
<orderEntry type="library" exported="" name="support-annotations-23.0.1" level="project" />
|
||||
<orderEntry type="library" exported="" name="android-android-17" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
Reference in New Issue
Block a user