Browse Source

feat: 🚀主界面

dev-calendar-view
niushuai233 1 year ago
parent
commit
578f9ca2d7
  1. 2
      app/src/main/AndroidManifest.xml
  2. 36
      app/src/main/java/cc/niushuai/didicheck/MainActivity.java
  3. 14
      app/src/main/java/cc/niushuai/didicheck/ui/main/TabsPagerAdapter.java
  4. 3
      app/src/main/java/cc/niushuai/didicheck/ui/main/home/HomeFragment.java
  5. 2
      app/src/main/java/cc/niushuai/didicheck/ui/main/records/DataListFragment.java
  6. 29
      app/src/main/java/cc/niushuai/didicheck/util/Toasts.java
  7. 17
      app/src/main/res/layout/activity_main.xml
  8. 3
      app/src/main/res/layout/item_list.xml
  9. BIN
      app/src/main/res/mipmap-hdpi/fab_icon_swimming.png
  10. BIN
      app/src/main/res/mipmap-mdpi/fab_icon_swimming.png
  11. BIN
      app/src/main/res/mipmap-xhdpi/fab_icon_swimming.png
  12. BIN
      app/src/main/res/mipmap-xxhdpi/fab_icon_swimming.png
  13. BIN
      app/src/main/res/mipmap-xxxhdpi/fab_icon_swimming.png
  14. 96
      app/src/main/res/values/strings.xml
  15. BIN
      icon/swimming.png

2
app/src/main/AndroidManifest.xml

@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/title_activity_main"
android:label="@string/app_name_zh_cn"
android:theme="@style/Theme.DiDiCheck.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

36
app/src/main/java/cc/niushuai/didicheck/MainActivity.java

@ -1,5 +1,6 @@ @@ -1,5 +1,6 @@
package cc.niushuai.didicheck;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
@ -8,35 +9,52 @@ import androidx.viewpager.widget.ViewPager; @@ -8,35 +9,52 @@ import androidx.viewpager.widget.ViewPager;
import com.github.clans.fab.FloatingActionButton;
import com.github.clans.fab.FloatingActionMenu;
import com.google.android.material.snackbar.Snackbar;
import cc.niushuai.didicheck.databinding.ActivityMainBinding;
import cc.niushuai.didicheck.ui.main.SectionsPagerAdapter;
import cc.niushuai.didicheck.ui.main.TabsPagerAdapter;
import cc.niushuai.didicheck.util.Toasts;
import cn.hutool.core.date.DateUtil;
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
context = this;
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager());
TabsPagerAdapter tabsPagerAdapter = new TabsPagerAdapter(this, getSupportFragmentManager());
ViewPager viewPager = binding.viewPager;
viewPager.setAdapter(sectionsPagerAdapter);
viewPager.setAdapter(tabsPagerAdapter);
FloatingActionMenu didiCheckMenu = binding.didiCheckMenu;
didiCheckMenu.setOnClickListener(new View.OnClickListener() {
FloatingActionButton swimActionButton = new FloatingActionButton(this);
swimActionButton.showButtonInMenu(true);
swimActionButton.show(true);
swimActionButton.setLabelText("游泳");
swimActionButton.setImageDrawable(this.getResources().getDrawable(R.mipmap.fab_icon_swimming, getTheme()));
// swimActionButton.setImageIcon(R.mipmap.fab_icon_swimming);
swimActionButton.setButtonSize(FloatingActionButton.SIZE_NORMAL);
swimActionButton.setColorNormal(this.getResources().getColor(R.color.white));
swimActionButton.setColorPressed(this.getResources().getColor(R.color.white));
swimActionButton.setTag("SWIM_TAG");
swimActionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
public void onClick(View v) {
Toasts.shortShow(context, DateUtil.now() + swimActionButton.getLabelText() + "打卡完成");
// 打卡完成 关闭动画
didiCheckMenu.close(true);
}
});
didiCheckMenu.addMenuButton(swimActionButton);
}
}

14
app/src/main/java/cc/niushuai/didicheck/ui/main/SectionsPagerAdapter.java → app/src/main/java/cc/niushuai/didicheck/ui/main/TabsPagerAdapter.java

@ -9,28 +9,30 @@ import androidx.fragment.app.FragmentManager; @@ -9,28 +9,30 @@ import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import cc.niushuai.didicheck.R;
import cc.niushuai.didicheck.ui.main.data.DataListFragment;
import cc.niushuai.didicheck.ui.main.home.HomeFragment;
import cc.niushuai.didicheck.ui.main.records.DataListFragment;
/**
* A [FragmentPagerAdapter] that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public class TabsPagerAdapter extends FragmentPagerAdapter {
@StringRes
private static final int[] TAB_TITLES = new int[]{R.string.tab_text_1, R.string.tab_text_2};
private static final int[] TAB_TITLES = new int[]{R.string.tab_home, R.string.tab_records, R.string.tab_settings};
private final Context mContext;
public SectionsPagerAdapter(Context context, FragmentManager fm) {
public TabsPagerAdapter(Context context, FragmentManager fm) {
super(fm);
mContext = context;
}
@Override
public Fragment getItem(int position) {
if (position == 1) {
if (position == 0) {
return new HomeFragment();
} else if (position == 1) {
return new DataListFragment();
} else if (position == 2) {
return new DataListFragment();
}
@ -45,6 +47,6 @@ public class SectionsPagerAdapter extends FragmentPagerAdapter { @@ -45,6 +47,6 @@ public class SectionsPagerAdapter extends FragmentPagerAdapter {
@Override
public int getCount() {
return 2;
return 3;
}
}

3
app/src/main/java/cc/niushuai/didicheck/ui/main/home/HomeFragment.java

@ -13,7 +13,6 @@ import androidx.annotation.NonNull; @@ -13,7 +13,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.DividerItemDecoration;
@ -59,7 +58,7 @@ public class HomeFragment extends Fragment { @@ -59,7 +58,7 @@ public class HomeFragment extends Fragment {
homeMainCalendar.setDate(DateUtil.date().getTime());
homeMainCalendar.setOnDateChangeListener((calendarView, year, month, day) -> {
long date = calendarView.getDate();
Log.d("tagxx", "tag = " + DateUtil.date(date).toDateStr());
Log.d("tagxx", "tag = " + DateUtil.date(date).toDateStr() + ", ==>" + year + month + day);
});
RecyclerView homeDataZoneRecyclerView = fragmentHomeBinding.homeDataZoneRecyclerView;

2
app/src/main/java/cc/niushuai/didicheck/ui/main/data/DataListFragment.java → app/src/main/java/cc/niushuai/didicheck/ui/main/records/DataListFragment.java

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
package cc.niushuai.didicheck.ui.main.data;
package cc.niushuai.didicheck.ui.main.records;
import androidx.fragment.app.Fragment;

29
app/src/main/java/cc/niushuai/didicheck/util/Toasts.java

@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
package cc.niushuai.didicheck.util;
import android.content.Context;
import android.widget.Toast;
import cn.hutool.core.util.StrUtil;
public class Toasts {
public static void shortShow(Context context, String msg) {
shortShow(context, msg, null);
}
public static void shortShow(Context context, String msg, String... params) {
show(context, Toast.LENGTH_SHORT, msg, params);
}
public static void longShow(Context context, String msg) {
longShow(context, msg, null);
}
public static void longShow(Context context, String msg, String... params) {
show(context, Toast.LENGTH_SHORT, msg, params);
}
public static void show(Context context, int duration, String msg, String... params) {
Toast.makeText(context, StrUtil.format(msg, params), duration).show();
}
}

17
app/src/main/res/layout/activity_main.xml

@ -60,22 +60,5 @@ @@ -60,22 +60,5 @@
app:menu_fab_label=""
app:menu_fab_show_animation="@anim/fab_scale_up"
app:menu_fab_hide_animation="@anim/fab_scale_down">
<com.github.clans.fab.FloatingActionButton
android:id="@+id/menu_item1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher_background"
app:fab_size="mini"
app:fab_label="Menu item 1" />
<com.github.clans.fab.FloatingActionButton
android:id="@+id/menu_item2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher_background"
app:fab_size="mini"
app:fab_label="Menu item 2" />
</com.github.clans.fab.FloatingActionMenu>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

3
app/src/main/res/layout/item_list.xml

@ -1,7 +1,6 @@ @@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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">
@ -11,7 +10,6 @@ @@ -11,7 +10,6 @@
android:layout_height="wrap_content"
android:layout_marginStart="29dp"
android:layout_marginTop="33dp"
android:text="标题"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@ -21,7 +19,6 @@ @@ -21,7 +19,6 @@
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:layout_marginTop="18dp"
android:text="内容"
app:layout_constraintStart_toStartOf="@id/item_list_title_textView"
app:layout_constraintTop_toBottomOf="@id/item_list_title_textView" />

BIN
app/src/main/res/mipmap-hdpi/fab_icon_swimming.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
app/src/main/res/mipmap-mdpi/fab_icon_swimming.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
app/src/main/res/mipmap-xhdpi/fab_icon_swimming.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
app/src/main/res/mipmap-xxhdpi/fab_icon_swimming.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
app/src/main/res/mipmap-xxxhdpi/fab_icon_swimming.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

96
app/src/main/res/values/strings.xml

@ -1,96 +1,8 @@ @@ -1,96 +1,8 @@
<resources>
<string name="app_name">DiDiCheck</string>
<string name="title_activity_main">MainActivity</string>
<string name="tab_text_1">Tab 1</string>
<string name="tab_text_2">Tab 2</string>
<string name="tab_text_3">Tab 3</string>
<string name="large_text">
"Material is the metaphor.\n\n"
<string name="app_name_zh_cn">滴滴打卡</string>
<string name="tab_home">Home</string>
<string name="tab_records">Records</string>
<string name="tab_settings">Settings</string>
"A material metaphor is the unifying theory of a rationalized space and a system of motion."
"The material is grounded in tactile reality, inspired by the study of paper and ink, yet "
"technologically advanced and open to imagination and magic.\n"
"Surfaces and edges of the material provide visual cues that are grounded in reality. The "
"use of familiar tactile attributes helps users quickly understand affordances. Yet the "
"flexibility of the material creates new affordances that supercede those in the physical "
"world, without breaking the rules of physics.\n"
"The fundamentals of light, surface, and movement are key to conveying how objects move, "
"interact, and exist in space and in relation to each other. Realistic lighting shows "
"seams, divides space, and indicates moving parts.\n\n"
"Bold, graphic, intentional.\n\n"
"The foundational elements of print based design typography, grids, space, scale, color, "
"and use of imagery guide visual treatments. These elements do far more than please the "
"eye. They create hierarchy, meaning, and focus. Deliberate color choices, edge to edge "
"imagery, large scale typography, and intentional white space create a bold and graphic "
"interface that immerse the user in the experience.\n"
"An emphasis on user actions makes core functionality immediately apparent and provides "
"waypoints for the user.\n\n"
"Motion provides meaning.\n\n"
"Motion respects and reinforces the user as the prime mover. Primary user actions are "
"inflection points that initiate motion, transforming the whole design.\n"
"All action takes place in a single environment. Objects are presented to the user without "
"breaking the continuity of experience even as they transform and reorganize.\n"
"Motion is meaningful and appropriate, serving to focus attention and maintain continuity. "
"Feedback is subtle yet clear. Transitions are efficient yet coherent.\n\n"
"3D world.\n\n"
"The material environment is a 3D space, which means all objects have x, y, and z "
"dimensions. The z-axis is perpendicularly aligned to the plane of the display, with the "
"positive z-axis extending towards the viewer. Every sheet of material occupies a single "
"position along the z-axis and has a standard 1dp thickness.\n"
"On the web, the z-axis is used for layering and not for perspective. The 3D world is "
"emulated by manipulating the y-axis.\n\n"
"Light and shadow.\n\n"
"Within the material environment, virtual lights illuminate the scene. Key lights create "
"directional shadows, while ambient light creates soft shadows from all angles.\n"
"Shadows in the material environment are cast by these two light sources. In Android "
"development, shadows occur when light sources are blocked by sheets of material at "
"various positions along the z-axis. On the web, shadows are depicted by manipulating the "
"y-axis only. The following example shows the card with a height of 6dp.\n\n"
"Resting elevation.\n\n"
"All material objects, regardless of size, have a resting elevation, or default elevation "
"that does not change. If an object changes elevation, it should return to its resting "
"elevation as soon as possible.\n\n"
"Component elevations.\n\n"
"The resting elevation for a component type is consistent across apps (e.g., FAB elevation "
"does not vary from 6dp in one app to 16dp in another app).\n"
"Components may have different resting elevations across platforms, depending on the depth "
"of the environment (e.g., TV has a greater depth than mobile or desktop).\n\n"
"Responsive elevation and dynamic elevation offsets.\n\n"
"Some component types have responsive elevation, meaning they change elevation in response "
"to user input (e.g., normal, focused, and pressed) or system events. These elevation "
"changes are consistently implemented using dynamic elevation offsets.\n"
"Dynamic elevation offsets are the goal elevation that a component moves towards, relative "
"to the component’s resting state. They ensure that elevation changes are consistent "
"across actions and component types. For example, all components that lift on press have "
"the same elevation change relative to their resting elevation.\n"
"Once the input event is completed or cancelled, the component will return to its resting "
"elevation.\n\n"
"Avoiding elevation interference.\n\n"
"Components with responsive elevations may encounter other components as they move between "
"their resting elevations and dynamic elevation offsets. Because material cannot pass "
"through other material, components avoid interfering with one another any number of ways, "
"whether on a per component basis or using the entire app layout.\n"
"On a component level, components can move or be removed before they cause interference. "
"For example, a floating action button (FAB) can disappear or move off screen before a "
"user picks up a card, or it can move if a snackbar appears.\n"
"On the layout level, design your app layout to minimize opportunities for interference. "
"For example, position the FAB to one side of stream of a cards so the FAB won’t interfere "
"when a user tries to pick up one of cards.\n\n"
</string>
</resources>

BIN
icon/swimming.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Loading…
Cancel
Save