diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 31b5e1d..d369e49 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,7 +15,7 @@ diff --git a/app/src/main/java/cc/niushuai/didicheck/MainActivity.java b/app/src/main/java/cc/niushuai/didicheck/MainActivity.java index 89b07e6..ef39af2 100644 --- a/app/src/main/java/cc/niushuai/didicheck/MainActivity.java +++ b/app/src/main/java/cc/niushuai/didicheck/MainActivity.java @@ -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; 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); + } } \ No newline at end of file diff --git a/app/src/main/java/cc/niushuai/didicheck/ui/main/SectionsPagerAdapter.java b/app/src/main/java/cc/niushuai/didicheck/ui/main/TabsPagerAdapter.java similarity index 74% rename from app/src/main/java/cc/niushuai/didicheck/ui/main/SectionsPagerAdapter.java rename to app/src/main/java/cc/niushuai/didicheck/ui/main/TabsPagerAdapter.java index d0948ef..aedb8ab 100644 --- a/app/src/main/java/cc/niushuai/didicheck/ui/main/SectionsPagerAdapter.java +++ b/app/src/main/java/cc/niushuai/didicheck/ui/main/TabsPagerAdapter.java @@ -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 { @Override public int getCount() { - return 2; + return 3; } } \ No newline at end of file diff --git a/app/src/main/java/cc/niushuai/didicheck/ui/main/home/HomeFragment.java b/app/src/main/java/cc/niushuai/didicheck/ui/main/home/HomeFragment.java index 97f5796..01b8280 100644 --- a/app/src/main/java/cc/niushuai/didicheck/ui/main/home/HomeFragment.java +++ b/app/src/main/java/cc/niushuai/didicheck/ui/main/home/HomeFragment.java @@ -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 { 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; diff --git a/app/src/main/java/cc/niushuai/didicheck/ui/main/data/DataListFragment.java b/app/src/main/java/cc/niushuai/didicheck/ui/main/records/DataListFragment.java similarity index 66% rename from app/src/main/java/cc/niushuai/didicheck/ui/main/data/DataListFragment.java rename to app/src/main/java/cc/niushuai/didicheck/ui/main/records/DataListFragment.java index b0495c6..ccad604 100644 --- a/app/src/main/java/cc/niushuai/didicheck/ui/main/data/DataListFragment.java +++ b/app/src/main/java/cc/niushuai/didicheck/ui/main/records/DataListFragment.java @@ -1,4 +1,4 @@ -package cc.niushuai.didicheck.ui.main.data; +package cc.niushuai.didicheck.ui.main.records; import androidx.fragment.app.Fragment; diff --git a/app/src/main/java/cc/niushuai/didicheck/util/Toasts.java b/app/src/main/java/cc/niushuai/didicheck/util/Toasts.java new file mode 100644 index 0000000..de94a63 --- /dev/null +++ b/app/src/main/java/cc/niushuai/didicheck/util/Toasts.java @@ -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(); + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index fcdc0b0..1aafee9 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -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"> - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_list.xml b/app/src/main/res/layout/item_list.xml index b93bf40..99c321f 100644 --- a/app/src/main/res/layout/item_list.xml +++ b/app/src/main/res/layout/item_list.xml @@ -1,7 +1,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 @@ 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" /> diff --git a/app/src/main/res/mipmap-hdpi/fab_icon_swimming.png b/app/src/main/res/mipmap-hdpi/fab_icon_swimming.png new file mode 100644 index 0000000..c7cd7be Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/fab_icon_swimming.png differ diff --git a/app/src/main/res/mipmap-mdpi/fab_icon_swimming.png b/app/src/main/res/mipmap-mdpi/fab_icon_swimming.png new file mode 100644 index 0000000..c86882a Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/fab_icon_swimming.png differ diff --git a/app/src/main/res/mipmap-xhdpi/fab_icon_swimming.png b/app/src/main/res/mipmap-xhdpi/fab_icon_swimming.png new file mode 100644 index 0000000..96d42e2 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/fab_icon_swimming.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/fab_icon_swimming.png b/app/src/main/res/mipmap-xxhdpi/fab_icon_swimming.png new file mode 100644 index 0000000..c71a6e6 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/fab_icon_swimming.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/fab_icon_swimming.png b/app/src/main/res/mipmap-xxxhdpi/fab_icon_swimming.png new file mode 100644 index 0000000..0323681 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/fab_icon_swimming.png differ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 285dbd5..f1b1f53 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,96 +1,8 @@ DiDiCheck - MainActivity - Tab 1 - Tab 2 - Tab 3 - - "Material is the metaphor.\n\n" + 滴滴打卡 + Home + Records + Settings - "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" - \ No newline at end of file diff --git a/icon/swimming.png b/icon/swimming.png new file mode 100644 index 0000000..8126523 Binary files /dev/null and b/icon/swimming.png differ