- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试使用协调器布局来实现以下效果:
我花了大约 30 小时以上的时间试图解决这个问题,我知道要走的路是使用 Coordinator Layout Behavior,但有很多事情我弄错了。
这是我的 xml:
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.StatisticsFragment">
<!-- TODO: Update blank fragment layout -->
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/background_light">
<android.support.design.widget.AppBarLayout
android:id="@+id/main.appbar"
android:layout_width="match_parent"
android:layout_height="137dp"
android:background="@android:color/transparent">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/main.collapsing"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:expandedTitleMarginStart="48dp"
app:expandedTitleMarginEnd="64dp">
<android.support.v7.widget.CardView
android:id="@+id/earningsCardView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.AppCompatTextView
android:id="@+id/todayLabel"
android:layout_width="108dp"
android:layout_height="26dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="12dp"
android:gravity="center"
android:text="TODAY"
android:textAlignment="center"
android:textColor="@android:color/darker_gray"
android:textSize="18sp"
app:layout_constraintEnd_toStartOf="@+id/guideline"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<android.support.v7.widget.AppCompatTextView
android:id="@+id/weekLabel"
android:layout_width="108dp"
android:layout_height="26dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="12dp"
android:gravity="center"
android:text="WEEK"
android:textAlignment="center"
android:textColor="@android:color/darker_gray"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline"
app:layout_constraintTop_toTopOf="parent" />
<android.support.v7.widget.AppCompatTextView
android:id="@+id/weekEarningsLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="center"
android:text="$800"
android:textAlignment="center"
android:textColor="@color/colorAccent"
android:textSize="32sp"
app:layout_constraintEnd_toEndOf="@+id/todayLabel"
app:layout_constraintStart_toStartOf="@+id/todayLabel"
app:layout_constraintTop_toBottomOf="@+id/todayLabel" />
<android.support.v7.widget.AppCompatTextView
android:id="@+id/todayEarningsLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp"
android:gravity="center"
android:text="$5200"
android:textAlignment="center"
android:textColor="@color/green_light"
android:textSize="32sp"
app:layout_constraintEnd_toEndOf="@+id/weekLabel"
app:layout_constraintStart_toStartOf="@+id/weekLabel"
app:layout_constraintTop_toBottomOf="@+id/weekLabel" />
<android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintGuide_percent="0.5012658"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"/>
<android.support.v7.widget.AppCompatTextView
android:id="@+id/todayOrderAmount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp"
android:text="18 deliveries"
android:textSize="12sp"
app:layout_constraintEnd_toEndOf="@+id/weekEarningsLabel"
app:layout_constraintStart_toStartOf="@+id/weekEarningsLabel"
app:layout_constraintTop_toBottomOf="@+id/weekEarningsLabel" />
<TextView
android:id="@+id/weekOrderAmount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:text="87 deliveries"
android:textSize="12sp"
app:layout_constraintEnd_toEndOf="@+id/todayEarningsLabel"
app:layout_constraintHorizontal_bias="0.51"
app:layout_constraintStart_toStartOf="@+id/todayEarningsLabel"
app:layout_constraintTop_toBottomOf="@+id/todayEarningsLabel" />
</android.support.constraint.ConstraintLayout>
</android.support.v7.widget.CardView>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v7.widget.RecyclerView
android:id="@+id/historicRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/earningsCardView" />
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
我创建了一个行为子类来尝试为今天的收入标签(绿色)设置动画:
class TodayEarningsLabelBehavior : CoordinatorLayout.Behavior<TextView>() {
override fun layoutDependsOn(parent: CoordinatorLayout?, child: TextView?, dependency: View?): Boolean {
return dependency is CardView
}
override fun onDependentViewChanged(parent: CoordinatorLayout?, child: TextView?, dependency: View?): Boolean {
if (child != null){
child.textSize = dependency!!.height / 3.0F
}
return false
}
}
但是,如果它不是 CoordinatorLayout
的子项,我如何通过 app:layout_behavior
在 xml 中将此行为设置为 $800 TextView?
任何解决此问题的方法(可能不涉及Coordinator Layout
)都非常受欢迎。
最佳答案
你来了:
有几个重要的注意事项:
globalLayoutListener
我这样声明我的 Activity :
public class CustomCardAnimationActivity extends AppCompatActivity {
NestedScrollView scrollView;
RecyclerView recyclerView;
CardView cardView;
TextView tvToday;
TextView tvTodayPrice;
TextView tvTodayDelivery;
TextView tvWeek;
TextView tvWeekPrice;
TextView tvWeekDelivery;
int cardHeight;
int textViewHeight;
float tvTitleTodayX;
float tvPriceTodayX;
float tvTitleWeekX;
float tvPriceWeekX;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom_card_animation);
recyclerView= (RecyclerView) findViewById(R.id.recyclerView);
scrollView= (NestedScrollView) findViewById(R.id.nested_scrollView);
cardView= (CardView) findViewById(R.id.cardView);
tvToday=(TextView) findViewById(R.id.textView_today);
tvTodayPrice=(TextView) findViewById(R.id.textView_today_price);
tvTodayDelivery=(TextView) findViewById(R.id.textView_today_delivery);
tvWeek=(TextView) findViewById(R.id.textView_week);
tvWeekPrice=(TextView) findViewById(R.id.textView_week_price);
tvWeekDelivery=(TextView) findViewById(R.id.textView_week_delivery);
scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
int scrollY = scrollView.getScrollY();
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) cardView.getLayoutParams();
int height = Math.max(textViewHeight,cardHeight-scrollY);
lp.height = height;
cardView.setLayoutParams(lp);
// alpha delivery textViews
tvTodayDelivery.setAlpha(Math.max(0f,(float) ((cardHeight/2)-scrollY)/(cardHeight/2)));
tvWeekDelivery.setAlpha(Math.max(0f,(float) ((cardHeight/2)-scrollY)/(cardHeight/2)));
// move titles to left
float titleMovementChange = Math.max(-scrollY , -textViewHeight);
tvToday.setX(tvTitleTodayX + titleMovementChange);
tvWeek.setX(tvTitleWeekX + titleMovementChange*1.2f);
// move prices to right
float priceMovementChange = Math.max(-scrollY , -textViewHeight/2);
tvTodayPrice.setX(tvPriceTodayX - priceMovementChange);
tvWeekPrice.setX(tvPriceWeekX - priceMovementChange * 1.2f);
}
});
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new TestListAdapter());
recyclerView.setNestedScrollingEnabled(false);
//if you remove this part, the card would be shown in its minimum state at start
recyclerView.post(new Runnable() {
@Override
public void run() {
scrollView.scrollTo(0,0);
}
});
// The calculation for heights of views should be done after the view created
View rootView = findViewById(R.id.root_view);
rootView.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
//Remove the listener before proceeding
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
rootView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
// measure your views here
cardHeight = cardView.getHeight();
textViewHeight= tvToday.getHeight();
tvTitleTodayX = tvToday.getX();
tvPriceTodayX = tvTodayPrice.getX();
tvTitleWeekX = tvWeek.getX();
tvPriceWeekX = tvWeekPrice.getX();
scrollView.scrollTo(0,0);
}
});
}
}
我的 xml 如下:
<FrameLayout
android:id="@+id/root_view"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#0099cc"
tools:context="com.bisphone.interviewtest.test.CustomCardAnimationActivity">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<android.support.v7.widget.CardView
android:id="@+id/cardView"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_margin="16dp"
app:cardElevation="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center">
<TextView
android:id="@+id/textView_today"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="top|center"
android:padding="8dp"
android:textSize="12sp"
android:text="TODAY"/>
<TextView
android:id="@+id/textView_today_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="800 $"
android:gravity="center"
android:padding="8dp"
android:textSize="14sp"
android:textStyle="bold"
android:textAlignment="center"
android:layout_gravity="center"
android:textColor="#4caf50"/>
<TextView
android:id="@+id/textView_today_delivery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="18 Deliveries"
android:padding="8dp"
android:textSize="12sp"
android:layout_gravity="bottom|center"
android:gravity="center"/>
</FrameLayout>
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center">
<TextView
android:id="@+id/textView_week"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="top|center"
android:textSize="12sp"
android:padding="8dp"
android:text="THIS WEEK"/>
<TextView
android:id="@+id/textView_week_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="5200 $"
android:textSize="14sp"
android:gravity="center"
android:layout_gravity="center"
android:textStyle="bold"
android:textAlignment="center"
android:textColor="#009688"/>
<TextView
android:id="@+id/textView_week_delivery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="87 Deliveries"
android:layout_gravity="bottom|center"
android:textSize="12sp"
android:gravity="center"
android:padding="8dp"/>
</FrameLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.NestedScrollView
android:id="@+id/nested_scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_margin="16dp"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:nestedScrollingEnabled="false"/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.v7.widget.CardView>
</FrameLayout>
关于android - 如何使用协调器布局和行为在 CardView 上完成此动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48236016/
从 Redis 获取消息时,onDone:(){print('done')} 从未起作用。 import 'package:dartis/dartis.dart' as redis show PubS
昨天我玩了一些vim脚本,并设法通过循环来对当前输入的内容进行状态栏预测(请参见屏幕截图(灰色+黄色栏))。 问题是,我不记得我是怎么得到的,也找不到我用于该vim魔术的代码片段(我记得它很简单):它
我尝试加载 bash_completion在我的 bash (3.2.25) 中,它不起作用。没有消息等。我在我的 .bashrc 中使用了以下内容 if [ -f ~/.bash_completio
我正在尝试构建一个 bash 完成例程,它将建议命令行标志和合适的标志值。例如在下面 fstcompose 命令我想比赛套路先建议 compose_filter= 标志,然后建议来自 [alt_seq
当我尝试在重定向符号后完成路径时,bash 完成的行为就好像它仍在尝试在重定向之前完成命令的参数一样。 例如: dpkg -l > /med标签 通过在 /med 之后点击 Tab我希望它完成通往 /
我的类中有几个 CAKeyframeAnimation 对象。 他们都以 self 为代表。 在我的animationDidStop函数中,我如何知道调用来自哪里? 是否有任何变量可以传递给 CAKe
我有一个带有 NSDateFormatter 的 NSTextField。格式化程序接受“mm/dd/yy”。 可以自动补全日期吗?因此,用户可以输入“mm”,格式化程序将完成当前月份和年份。 最佳答
有一个解决方案可以使用以下方法完成 NSTextField : - (NSArray *)control:(NSControl *)control textView:(NSTextView *)tex
我正在阅读 Passport 的文档,我注意到 serialize()和 deserialize() done()被调用而不被返回。 但是,当使用 passport.use() 设置新策略时在回调函数
在 ubuntu 11.10 上的 Firefox 8.0 中,尽管 img.complete 为 false,但仍会调用 onload 函数 draw。我设法用 setTimeout hack 解决
假设我有两个与两个并行执行的计算相对应的 future 。我如何等到第一个 future 准备好?理想情况下,我正在寻找类似于Python asyncio's wait且参数为return_when=
我正在寻找一种 Java 7 数据结构,其行为类似于 java.util.Queue,并且还具有“最终项目已被删除”的概念。 例如,应可以表达如下概念: while(!endingQueue.isFi
这是一个简单的问题。 if ($('.dataTablePageList')) { 我想做的是执行一个 if 语句,该语句表示如果具有 dataTablesPageList 类的对象也具有 menu
我用replaceWith批量替换了许多div中的html。替换后,我使用 jTruncate 来截断文本。然而它不起作用,因为在执行时,replaceWith 还没有完成。 我尝试了回调技巧 ( H
有没有办法调用 javascript 表单 submit() 函数或 JQuery $.submit() 函数并确保它完成提交过程?具体来说,在一个表单中,我试图在一个 IFrame 中提交一个表单。
我有以下方法: function animatePortfolio(fadeElement) { fadeElement.children('article').each(function(i
我刚刚开始使用 AndEngine, 我正在像这样移动 Sprite : if(pValueY < 0 && !jumping) { jumping =
我正在使用 asynctask 来执行冗长的操作,例如数据库读取。我想开始一个新 Activity 并在所有异步任务完成后呈现其内容。实现这一目标的最佳方法是什么? 我知道 onPostExecute
我有一个脚本需要命令名称和该命令的参数作为参数。 所以我想编写一个完成函数来完成命令的名称并完成该命令的参数。 所以我可以这样完成命令的名称 if [[ "$COMP_CWORD" == 1 ]];
我的应用程序有一个相当奇怪的行为。我在 BOOT_COMPLETE 之后启动我的应用程序,因此在我启动设备后它是可见的。 GUI 响应迅速,一切正常,直到我调用 finish(),按下按钮时,什么都没
我是一名优秀的程序员,十分优秀!