package notebook.shbehk.notebook; import android.content.Context; import android.graphics.*; import android.support.design.widget.BottomNavigationView; import android.util.AttributeSet; public class CurvedBottomNavigationView extends BottomNavigationView { private Path mPath; private Paint mPaint; /** the CURVE_CIRCLE_RADIUS represent the radius of the fab button */ private final int CURVE_CIRCLE_RADIUS = 256 / 2; // the coordinates of the first curve private Point mFirstCurveStartPoint = new Point(); private Point mFirstCurveEndPoint = new Point(); private Point mFirstCurveControlPoint1 = new Point(); private Point mFirstCurveControlPoint2 = new Point(); //the coordinates of the second curve @SuppressWarnings("FieldCanBeLocal") private Point mSecondCurveStartPoint = new Point(); private Point mSecondCurveEndPoint = new Point(); private Point mSecondCurveControlPoint1 = new Point(); private Point mSecondCurveControlPoint2 = new Point(); private int mNavigationBarWidth; private int mNavigationBarHeight; public CurvedBottomNavigationView(Context context) { super(context); init(); } public CurvedBottomNavigationView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CurvedBottomNavigationView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPath = new Path(); mPaint = new Paint(); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); mPaint.setColor(Color.WHITE); setBackgroundColor(Color.TRANSPARENT); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); // get width and height of navigation bar // Navigation bar bounds (width & height) mNavigationBarWidth = getWidth(); mNavigationBarHeight = getHeight(); // the coordinates (x,y) of the start point before curve mFirstCurveStartPoint.set((mNavigationBarWidth / 2) - (CURVE_CIRCLE_RADIUS * 2) - (CURVE_CIRCLE_RADIUS / 3), 0); // the coordinates (x,y) of the end point after curve mFirstCurveEndPoint.set(mNavigationBarWidth / 2, CURVE_CIRCLE_RADIUS + (CURVE_CIRCLE_RADIUS / 4)); // same thing for the second curve mSecondCurveStartPoint = mFirstCurveEndPoint; mSecondCurveEndPoint.set((mNavigationBarWidth / 2) + (CURVE_CIRCLE_RADIUS * 2) + (CURVE_CIRCLE_RADIUS / 3), 0); // the coordinates (x,y) of the 1st control point on a cubic curve mFirstCurveControlPoint1.set(mFirstCurveStartPoint.x + CURVE_CIRCLE_RADIUS + (CURVE_CIRCLE_RADIUS / 4), mFirstCurveStartPoint.y); // the coordinates (x,y) of the 2nd control point on a cubic curve mFirstCurveControlPoint2.set(mFirstCurveEndPoint.x - (CURVE_CIRCLE_RADIUS * 2) + CURVE_CIRCLE_RADIUS, mFirstCurveEndPoint.y); mSecondCurveControlPoint1.set(mSecondCurveStartPoint.x + (CURVE_CIRCLE_RADIUS * 2) - CURVE_CIRCLE_RADIUS, mSecondCurveStartPoint.y); mSecondCurveControlPoint2.set(mSecondCurveEndPoint.x - (CURVE_CIRCLE_RADIUS + (CURVE_CIRCLE_RADIUS / 4)), mSecondCurveEndPoint.y); mPath.reset(); mPath.moveTo(0, 0); mPath.lineTo(mFirstCurveStartPoint.x, mFirstCurveStartPoint.y); mPath.cubicTo(mFirstCurveControlPoint1.x, mFirstCurveControlPoint1.y, mFirstCurveControlPoint2.x, mFirstCurveControlPoint2.y, mFirstCurveEndPoint.x, mFirstCurveEndPoint.y); mPath.cubicTo(mSecondCurveControlPoint1.x, mSecondCurveControlPoint1.y, mSecondCurveControlPoint2.x, mSecondCurveControlPoint2.y, mSecondCurveEndPoint.x, mSecondCurveEndPoint.y); mPath.lineTo(mNavigationBarWidth, 0); mPath.lineTo(mNavigationBarWidth, mNavigationBarHeight); mPath.lineTo(0, mNavigationBarHeight); mPath.close(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawPath(mPath, mPaint);
} }
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import com.example.saidi.custombottobar.R;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CurvedBottomNavigationView curvedBottomNavigationView = findViewById(R.id.customBottomBar);
curvedBottomNavigationView.inflateMenu(R.menu.bottom_menu);
}
}
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorAccent"
tools:context=".view.MainActivity">
<com.example.saidi.custombottobar.view.CurvedBottomNavigationView
android:id="@+id/customBottomBar"
android:layout_width="match_parent"
android:layout_height="72dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_favorites"
android:enabled="true"
android:icon="@android:drawable/alert_dark_frame"
android:title="Page1"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/action_schedules"
android:enabled="true"
android:title="Page2"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/action_music"
android:enabled="true"
android:icon="@android:drawable/alert_dark_frame"
android:title="Page3"
app:showAsAction="ifRoom"/>
</menu>
ليست هناك تعليقات:
إرسال تعليق