菜鸟带你仿APP之YP神器--《探探》(一)

这一次作为菜鸟,我要带你从零开始搭建一个APP,当然是仿照的,而且没有后台的尴尬,自己刚入门,对后台这块比较陌生,只能小打小闹,做做布局而已,若读者是菜鸟级别,我们倒是可以相互切磋,老鸟不喜勿喷大笑

首先看看我们要仿照的APP界面



可以第一次登录的时候有个雷达效果,两个按钮--注册和登录,分别点击的时候有界面的跳转。

分析完了界面之后就带大家来实现以下这样的效果。首先看下长得比较丑的Demo效果,自定义VIew实现扫描


关于这个圆环扫描界面的实现主要是参考张鸿洋的博文而来,在此对作者表示感谢,同时附上博文地址

《Android 自定义View (三) 圆环交替 等待效果》http://blog.csdn.net/lmj623565791/article/details/24500107

对于想入门android自定义VIew的同学来说,鸿洋的文章真的很大,我这个界面的重点知识就是自定义VIew,如果游兴趣的同学可以参考下我的写法。

public class RadarView extends View {

    private Paint mPaint; // 画笔
    private int mForeColor; // 前景颜色
    private int mBackColor; // 背景颜色
    private int mRadius; // 半径
    private int mCenterImageResId; // 中间图片的资源ID
    private int mSpeed; // 扫描的速度
    private final static int DEFAULT_SPEED = 10;
    private final static int DEFAULT_RADIUS = 20;
    private int mCurrentIndex; // 扫描的当前的位置
    private BitmapShader mBitmapShader;

    public RadarView(Context context) {
        this(context, null);
    }

    public RadarView(Context context, AttributeSet attrs) {
        this(context, attrs, 0); // 调用三个参数的构造方法
    }

    public RadarView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // 在这个构造方法里面获取属性值
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RadarView, defStyleAttr, 0);
        // 遍历属性列表
        for (int i = 0; i < typedArray.getIndexCount(); i++) {
            int attr = typedArray.getIndex(i); // 得到属性值
            // 将各自的属性值对号入座
            switch (attr) {
                case R.styleable.RadarView_radarForeColor:
                    mForeColor = typedArray.getColor(attr, Color.BLUE);
                    break;
                case R.styleable.RadarView_radarBackColor:
                    mBackColor = typedArray.getColor(attr, Color.WHITE);
                    break;
                case R.styleable.RadarView_radarRadius:
                    mRadius = typedArray.getDimensionPixelSize(attr,
                            (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, DEFAULT_RADIUS, getResources().getDisplayMetrics()));
                    break;
                case R.styleable.RadarView_radarCenterImageResId:
                    mCenterImageResId = typedArray.getResourceId(attr, R.mipmap.ic_launcher);
                    break;
                case R.styleable.RadarView_radarSpeed:
                    mSpeed = typedArray.getInteger(attr, DEFAULT_SPEED);
                    break;
            }
        }

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    mCurrentIndex += 2 ;
                    if (mCurrentIndex == 360) {
                        mCurrentIndex = 0;
                    }
                    postInvalidate();
                    try {
                        Thread.sleep(mSpeed);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        int cx = getWidth() / 2;
        int radius = cx - mRadius/2 ;
        mPaint.setStrokeWidth(mRadius);

        mPaint.setColor(mBackColor);
        mPaint.setStyle(Paint.Style.FILL);
        canvas.drawCircle(cx, cx, radius, mPaint);
        mPaint.setColor(mForeColor);
        RectF oval = new RectF(cx - radius, cx - radius, cx + radius, cx + radius);
        canvas.drawArc(oval, -90, mCurrentIndex, true , mPaint);
        RectF bitmapRect = new RectF(cx - 80 , cx - 80 , cx + 80 , cx + 80);
        mPaint.setColor(Color.WHITE);
        canvas.drawCircle(bitmapRect.centerX() , bitmapRect.centerY() , 80 , mPaint);
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),mCenterImageResId);
        mPaint.setAntiAlias(true);
        mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        mPaint.setShader(mBitmapShader);
        canvas.drawBitmap(bitmap , null , bitmapRect , null);

    }

}
注意:在XML布局中使用自定义VIew的时候默认是调用两个参数的构造方法,也就是在这里默认会调用
RadarView(Context context, AttributeSet attrs)

这里整个画图和绘制的实现我们是在三个参数的构造方法中完成的,所以让两个参数的构造方法实现三个参数的构造方法就好了,

 this(context, attrs, 0); // 调用三个参数的构造方法

这点很重要,如果你愿意,其实你也可以直接在两个参数的构造器中去绘制和实现功能;


这里我在VIew的中间化了一个Bitmap,就是图中那个圆形的风车图片

	Bitmap bitmap = BitmapFactory.decodeResource(getResources(),mCenterImageResId);
        mPaint.setAntiAlias(true);
        mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        mPaint.setShader(mBitmapShader);
        canvas.drawBitmap(bitmap , null , bitmapRect , null);

在Values文件夹下新建一个attrs.xml文件,用来存储要用到的一些属性声明

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!--自定义雷达View需要的一些属性值-->
    <declare-styleable name="RadarView">
        <attr name="radarForeColor" format="color"/>
        <attr name="radarBackColor" format="color"/>
        <attr name="radarCenterImageResId" format="reference"/>
        <attr name="radarSpeed" format="integer"/>
        <attr name="radarRadius" format="dimension"/>
    </declare-styleable>

</resources>

然后在 activity_main.xml中添加我们刚刚自定义的View

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:cjt="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:gravity="center_horizontal"
    tools:context="com.cjt.tantandemo.MainActivity">

    <com.cjt.tantandemo.view.RadarView
        android:id="@+id/mRadarView"
        android:layout_width="300dp"
        cjt:radarForeColor="@color/colorPrimary"
        cjt:radarBackColor="@color/colorAccent"
        cjt:radarSpeed="20"
        cjt:radarRadius="100dp"
        cjt:radarCenterImageResId="@mipmap/windmill"
        android:layout_height="250dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

    <Button
        android:id="@+id/register_btn"
        android:layout_marginTop="15dp"
        android:layout_width="120dp"
        android:text="@string/login_btn"
        android:layout_height="wrap_content"
        android:layout_below="@+id/login_btn"
        android:layout_centerHorizontal="true"
        android:layout_alignLeft="@+id/login_btn"
        android:layout_alignStart="@+id/login_btn" />

    <Button
        android:id="@+id/login_btn"
        android:text="@string/register_btn"
        android:layout_marginTop="15dp"
        android:layout_width="120dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/mRadarView"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

直接运行就可以看到我们图中的效果了,至于两个按钮的点击和跳转相信难不倒大家,所以这里我就不重点拿出来写了,源码等完成了整个项目的模仿在上传。又需要的可以留言。




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 要成为一个Python的大牛,需要通过一系列实战经验来不断进阶。 首先,我们需要从菜鸟开始,学习基本的语法和常用库。掌握Python的基本语法、变量、数据类型、条件语句和循环语句等是必不可少的。此外,还要熟悉常用的Python库,如NumPy、Pandas和Matplotlib等,这些库在数据处理和可视化方面都非常常用。 接下来,我们需要通过实战来巩固所学的知识。可以选择一些小项目来实践,比如编写一个简单的Web应用、爬取网页数据或者创建一个简单的机器学习模型。通过实际应用,可以提升对Python的实际运用能力。 在实战过程中,我们需要积累并解决一些常见的问题。这些问题可能涉及到代码的优化、调试、性能优化等方面。通过解决这些问题,我们可以提升自己的编程能力,并且学会更高效地利用Python来解决实际问题。 另外,为了进一步提升自己的水平,可以参与开源项目或者自己创建项目。通过参与开源项目,可以学习到更多高级的编程技术和实践经验。同时,创建自己的项目有助于锻炼独立思考和解决问题的能力。 除了对Python语言的掌握外,我们还需要了解相关的领域知识。比如,在数据科学领域,需要学习统计学、机器学习和数据挖掘等知识。通过将Python与领域知识相结合,可以在相关领域中发挥更大的作用。 总而言之,成为一个Python的大牛需要不断地实践和学习。通过不断地积累实战经验,掌握并解决常见问题,参与开源项目或者自己创建项目,同时结合相关领域的知识,多角度地深入学习Python。这样的进阶之路需要耐心和毅力,但最终将能够取得令人骄傲的成果。 ### 回答2: Python是一门广泛应用于软件开发和数据分析的编程语言,具有简洁易学、功能强大的特点,因此非常适合初学者入门。然而,要想从菜鸟到大牛,需要不断拓展知识,提升技能。 首先,要全面掌握Python的基础知识,包括语法、数据类型、条件语句、循环语句等。可以通过阅读相关书籍、教程、参加培训班等方式进行学习。 其次,理解面向对象编程(OOP)是进阶的关键。Python是一门支持OOP的语言,掌握面向对象的概念和用法可以使代码更加模块化和可重用。可以通过练习编写类和对象,深入理解继承、封装和多态等概念。 另外,掌握Python标准库和第三方库也是提升的必要条件。标准库包含了许多常用的模块和函数,如操作文件、网络编程、并发等。同时,第三方库可以满足更具体的需求,如数据分析(NumPy、Pandas)、机器学习(Scikit-learn、TensorFlow)等。可以通过实践项目和参与开源社区来积累经验和熟悉常用的库。 此外,代码优化和性能调优也是进阶的一环。良好的代码结构、规范的命名和注释可以提高代码的可读性和可维护性。同时,了解性能优化的技巧和工具可以提高程序的执行效率。 最后,实际项目经验是从菜鸟到大牛的关键。通过实践解决真实的问题,遇到的挑战和解决方案都可以让你不断成长。可以自己找项目实践,也可以参与开源项目、参加比赛等方式来积攒经验。 总的来说,进阶的过程需要坚持不懈的学习和实践,并且保持持续学习的动力。不断总结和思考,参与开源社区和技术讨论也可以获得更多的启发和帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涛声依旧Cjt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值