下面列出了android.view.View#getY ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
if (getDivider() == null) {
return;
}
final int childCount = parent.getChildCount();
final int width = parent.getWidth();
for (int childViewIndex = 0; childViewIndex < childCount; childViewIndex++) {
final View view = parent.getChildAt(childViewIndex);
if (shouldDrawDividerBelow(view, parent)) {
int top = (int) view.getY() + view.getHeight() + mPadding;
getDivider().setBounds(0, top, width, top + getDividerHeight());
getDivider().draw(c);
}
}
}
private void onPenSettingClick() {
if (this.penSettingEnabled) {
if (this.penSetting.isShown()) {
this.penSetting.setVisibility(View.GONE);
} else {
this.penSetting.setViewMode(SpenSettingPenLayout.VIEW_MODE_EXTENSION);
final View toolsLayout = (View)this.rootLayout.findViewById(R.id.pen_buttons).getParent();
final FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)this.penSetting.getLayoutParams();
params.leftMargin = (int)toolsLayout.getX() + this.penButton.getLeft();
params.topMargin = (int)toolsLayout.getY() + this.penButton.getTop() + this.penButton.getHeight();
this.penSetting.setLayoutParams(params);
this.penSetting.setVisibility(View.VISIBLE);
}
}
}
/**
* Define one of the point in where the FAB should be hide when it reaches that point.
* @param coordinatorLayout container of BottomSheet and AppBarLayout
*/
private void setOffsetValue(CoordinatorLayout coordinatorLayout) {
for (int i = 0; i < coordinatorLayout.getChildCount(); i++) {
View child = coordinatorLayout.getChildAt(i);
if (child instanceof MergedAppBarLayout) {
offset = child.getY()+child.getHeight();
break;
}
// if (child instanceof AppBarLayout) {
//
// if (child.getTag() != null &&
// child.getTag().toString().contentEquals("modal-appbar") ) {
// offset = child.getY()+child.getHeight();
// break;
// }
// }
}
}
public ArrayList<Tag> getTags() {
ArrayList<Tag> tags = new ArrayList<>();
if (!mTagList.isEmpty()) {
for (int i = 0; i < mTagList.size(); i++) {
View view = mTagList.get(i);
float x = view.getX();
x = (x / mRootWidth) * 100;
float y = view.getY();
y = (y / mRootHeight) * 100;
tags.
add(new Tag(((TextView) view.
findViewById(R.id.tag_text_view)).getText().toString(), x, y));
}
}
return tags;
}
private int getGroupHeaderTop(final RecyclerView parent, boolean isReverseLayout, View child, int adapterPos, int layoutPosition) {
if (mExpandableAdapter == null) return 0;
if (child.getY() > mDrawingInfo.sticky.bottom) {
return OFFSET_NOT_FOUND;
}
int top = mDrawingInfo.sticky.bottom == 0 ? (int) child.getY() : mDrawingInfo.sticky.bottom;
int childCount = parent.getChildCount();
final long currentHeaderId = mExpandableAdapter.getGroupUniqueId(adapterPos);
return calculateTop(isReverseLayout, layoutPosition, childCount, top, new Function<Integer, Integer>() {
@Override
public Integer apply(Integer integer) {
return calculateGroupOffset(parent, currentHeaderId, integer);
}
});
}
/**
* 设置小球数据,根据数据集合创建小球数量
*
* @param modelList 数据集合
*/
public void setModelList(final List<WaterModel> modelList, View view) {
if (modelList == null || modelList.isEmpty()) {
return;
}
this.treeCenterX = view.getX();
this.treeCenterY = view.getY();
removeAllViews();
post(new Runnable() {
@Override
public void run() {
addWaterView(modelList);
}
});
}
private void swipe(MotionEvent motionEvent){
int firstVisibleItem = mLayoutManager.findFirstCompletelyVisibleItemPosition();
View firstItem = mLayoutManager.findViewByPosition(firstVisibleItem);
float span = 0;
if (firstItem != null){
span = firstItem.getY() <= 0 ? firstItem.getY() : 0;
}
float y = (motionEvent.getY()) + span;
int itemInScreen = (int) y / mDragView.getHeight();
int moveTo = itemInScreen + firstVisibleItem;
if (mFrom != moveTo) {
if (mFrom > moveTo){
int temp = mFrom;
mFrom = moveTo;
moveTo = temp;
}
if (mFrom < 0 || moveTo >= mTabs.size()){
return;
}
mTabs.add(mFrom, mTabs.get(moveTo));
mTabs.add(moveTo + 1, mTabs.get(mFrom + 1));
mTabs.remove(mFrom + 1);
mTabs.remove(moveTo + 1);
mTabSelectAdapter.notifyItemMoved(mFrom, moveTo);
mTabSelectAdapter.notifyItemRangeChanged(mFrom, moveTo - mFrom + 1);
}
}
@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
if(child.getVisibility() == View.VISIBLE&&viewY==0){
//获取控件距离父布局(coordinatorLayout)底部距离
viewY=coordinatorLayout.getHeight()-child.getY();
}
return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;//判断是否竖直滚动
}
@Test
public void deleteItemInTheFirstLine_ItemHasMaximumHeight_SameStartPadding() throws Exception {
//arrange
//just adapt input items list to required start values
items.remove(1);
activity.runOnUiThread(() -> activity.initialize());
ViewInteraction recyclerView = onView(withId(R.id.rvTest)).check(matches(isDisplayed()));
InstrumentalUtil.waitForIdle();
View second = layoutManager.getChildAt(1);
int startHeight = second.getHeight();
double expectedY = second.getY();
//act
recyclerView.perform(
actionDelegate(((uiController, view) -> items.remove(1))),
notifyItemRemovedAction(1));
InstrumentalUtil.waitForIdle();
second = layoutManager.getChildAt(1);
int endHeight = second.getHeight();
double resultY = second.getY();
//assert
//check test behaviour
assumeTrue(startHeight > endHeight);
assertNotEquals(0, expectedY, 0.01);
assertNotEquals(0, resultY, 0.01);
assertEquals(resultY, expectedY, 0.01);
}
public FlingCardListener(View frame, Object itemAtPosition, float rotation_degrees, FlingListener flingListener) {
super();
this.frame = frame;
this.objectX = frame.getX();
this.objectY = frame.getY();
this.objectH = frame.getHeight();
this.objectW = frame.getWidth();
this.halfWidth = objectW / 2f;
this.dataObject = itemAtPosition;
this.parentWidth = ((ViewGroup) frame.getParent()).getWidth();
this.BASE_ROTATION_DEGREES = rotation_degrees;
this.mFlingListener = flingListener;
}
private int calculateStickyOffset(RecyclerView parent, int headerHeight, long currentHeaderId, int nextPosition) {
if (mStickyAdapter == null) return 0;
int adapterPosHere = parent.getChildAdapterPosition(parent.getChildAt(nextPosition));
if (adapterPosHere != RecyclerView.NO_POSITION) {
long nextId = mStickyAdapter.getStickyId(adapterPosHere);
if (nextId != currentHeaderId && nextId != NO_STICKY_ID) {
View next = parent.getChildAt(nextPosition);
RecyclerView.ViewHolder viewHolder = getStickyHeader(parent, adapterPosHere);
if (viewHolder == null) return 0;
return ((int) next.getY()) - (headerHeight + viewHolder.itemView.getHeight());
}
}
return 0;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (v.getId() == R.id.small_renderer) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
dX = v.getX() - event.getRawX();
dY = v.getY() - event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
v.animate()
.x(event.getRawX() + dX)
.y(event.getRawY() + dY)
.setDuration(0)
.start();
break;
case MotionEvent.ACTION_UP:
v.animate()
.x(event.getRawX() + dX >= event.getRawY() + dY ? event.getRawX()
+ dX : 0)
.y(event.getRawX() + dX >= event.getRawY() + dY ? 0
: event.getRawY() + dY)
.setDuration(10)
.start();
break;
}
}
return true;
}
/**
* 初始化动画值
*
* @param child 图片控件
* @param dependency ToolBar
*/
private void shouldInitProperties(CircleImageView child, View dependency) {
// 图片控件中心
if (mStartYPosition == 0)
mStartYPosition = (int) (child.getY() + (child.getHeight() / 2));
// Toolbar中心
if (mFinalYPosition == 0)
mFinalYPosition = (dependency.getHeight() / 2);
// 图片高度
if (mStartHeight == 0)
mStartHeight = child.getHeight();
// Toolbar缩略图高度
if (mFinalHeight == 0)
mFinalHeight = mContext.getResources().getDimensionPixelOffset(R.dimen.image_final_width);
// 图片控件水平中心
if (mStartXPosition == 0)
mStartXPosition = (int) (child.getX() + (child.getWidth() / 2));
// 边缘+缩略图宽度的一半
if (mFinalXPosition == 0)
mFinalXPosition = mContext.getResources().getDimensionPixelOffset(R.dimen.abc_action_bar_content_inset_material) + (mFinalHeight / 2);
// Toolbar的起始位置
if (mStartToolbarPosition == 0)
mStartToolbarPosition = dependency.getY() + (dependency.getHeight() / 2);
}
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, CircleImageView child, View dependency) {
// 初始化属性
shouldInitProperties(child, dependency);
// 最大滑动距离: 起始位置-状态栏高度
final int maxScrollDistance = (int) (mStartToolbarPosition - getStatusBarHeight());
// 滑动的百分比
float expandedPercentageFactor = dependency.getY() / maxScrollDistance;
// Y轴距离
float distanceYToSubtract = ((mStartYPosition - mFinalYPosition)
* (1f - expandedPercentageFactor)) + (child.getHeight() / 2);
// X轴距离
float distanceXToSubtract = ((mStartXPosition - mFinalXPosition)
* (1f - expandedPercentageFactor)) + (child.getWidth() / 2);
// 高度减小
float heightToSubtract = ((mStartHeight - mFinalHeight) * (1f - expandedPercentageFactor));
// 图片位置
child.setY(mStartYPosition - distanceYToSubtract);
child.setX(mStartXPosition - distanceXToSubtract);
// 图片大小
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) child.getLayoutParams();
lp.width = (int) (mStartHeight - heightToSubtract);
lp.height = (int) (mStartHeight - heightToSubtract);
child.setLayoutParams(lp);
return true;
}
/**
* 获取view在屏幕中的绝对y坐标
*/
private static float getAbsoluteY(View view) {
float y = view.getY();
ViewParent parent = view.getParent();
if (parent instanceof View) {
y += getAbsoluteY((View) parent);
}
return y;
}
/**
* This method gets the value of the named property from the View object.
*
* @param propertyConstant The property whose value should be returned
* @return float The value of the named property
*/
private float getValue(int propertyConstant) {
//final View.TransformationInfo info = mView.mTransformationInfo;
View v = mView.get();
if (v != null) {
switch (propertyConstant) {
case TRANSLATION_X:
//return info.mTranslationX;
return v.getTranslationX();
case TRANSLATION_Y:
//return info.mTranslationY;
return v.getTranslationY();
case ROTATION:
//return info.mRotation;
return v.getRotation();
case ROTATION_X:
//return info.mRotationX;
return v.getRotationX();
case ROTATION_Y:
//return info.mRotationY;
return v.getRotationY();
case SCALE_X:
//return info.mScaleX;
return v.getScaleX();
case SCALE_Y:
//return info.mScaleY;
return v.getScaleY();
case X:
//return v.mLeft + info.mTranslationX;
return v.getX();
case Y:
//return v.mTop + info.mTranslationY;
return v.getY();
case ALPHA:
//return info.mAlpha;
return v.getAlpha();
}
}
return 0;
}
public static float getY(View view) {
return view.getY();
}
static float getY(View view) {
return view.getY();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
}
int action = event.getAction();
float touchRawX = event.getRawX();
float touchRawY = event.getRawY();
float touchX = event.getX();
float touchY = event.getY();
if (action == MotionEvent.ACTION_DOWN) {
boolean xOK = touchX >= v.getWidth() * 3 / 4 && touchX <= v.getWidth();
boolean yOK = touchY >= v.getHeight() * 2 / 4 && touchY <= v.getHeight();
scale = xOK && yOK;
}
if (action == MotionEvent.ACTION_MOVE) {
float deltaRawX = touchRawX - lastTouchRawX;
float deltaRawY = touchRawY - lastTouchRawY;
if (scale) {
// rotate
float centerX = v.getX() + (float) v.getWidth() / 2;
float centerY = v.getY() + (float) v.getHeight() / 2;
double angle = Math.atan2(touchRawY - centerY, touchRawX - centerX) * 180 / Math.PI;
v.setRotation((float) angle - 45);
// scale
float xx = (touchRawX >= centerX ? deltaRawX : -deltaRawX);
float yy = (touchRawY >= centerY ? deltaRawY : -deltaRawY);
float sf = (v.getScaleX() + xx / v.getWidth() + v.getScaleY() + yy / v.getHeight()) / 2;
v.setScaleX(sf);
v.setScaleY(sf);
} else {
// translate
v.setTranslationX(v.getTranslationX() + deltaRawX);
v.setTranslationY(v.getTranslationY() + deltaRawY);
}
}
if (action == MotionEvent.ACTION_UP) {
// 当 mMediaStreamingManager.setAutoRefreshOverlay(false) 时自动刷新关闭,建议在 UP 事件里进行手动刷新。
// mMediaStreamingManager.refreshOverlay(v, false);
}
lastTouchRawX = touchRawX;
lastTouchRawY = touchRawY;
return true;
}
static float getY(View view) {
return view.getY();
}