Python学习笔记_04:Django框架简介

1.兑现两栽颜色的TextView:

 

1.1
根据当前之快以演示效果自己不怕默认为0.6f,那么中的细分位置就是0.6f控件的升幅
1.2
在onDraw()中我们以计算好的划分位置好去绘制文字,裁剪绘制内容有即可
1.3
画字是canvas.drawText(String text, float x, float y, Paint paint)
这些参数不打听的若得温馨去google看一下了,温馨提醒参数y是文字的基线,给一样摆图片看吧:
图片 1

 

Java:

public class ColorTrackTextView extends TextView {
    // 默认的字体颜色的画笔
    private Paint mOriginPaint;
    // 改变的字体颜色的画笔
    private Paint mChangePaint;
    // 当前的进度
    private float mCurrentProgress = 0.6f;
    private String TAG = "CTTV";

    // 当前文本
    private String mText;

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

    public ColorTrackTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ColorTrackTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint();
    }

    /**
     * 初始化画笔
     */
    private void initPaint() {
        mOriginPaint = getPaintByColor(Color.BLACK);
        mChangePaint = getPaintByColor(Color.RED);
    }

    /**
     * 获取画笔根据不同的颜色
     */
    private Paint getPaintByColor(int color) {
        Paint paint = new Paint();
        // 抗锯齿
        paint.setAntiAlias(true);
        // 仿抖动
        paint.setDither(true);
        paint.setColor(color);
        // 字体的大小设置为TextView的文字大小
        paint.setTextSize(getTextSize());
        return paint;
    }


    /**
     * 这里肯定是自己去画  不能用super
     */
    @Override
    protected void onDraw(Canvas canvas) {
        // 获取当前文本
        mText = getText().toString();
        // 获取控件宽度
        int width = getWidth();
        if (!TextUtils.isEmpty(mText)) {
            // 根据当前进度计算中间位置
            int middle = (int) (width * mCurrentProgress);
            drawOrigin(canvas, middle);
            drawChange(canvas, middle);
        }
    }

    /**
     * 画变色的字体部分
     */
    private void drawChange(Canvas canvas, int middle) {
        drawText(canvas, mChangePaint, 0, middle);
    }

    /**
     * 画不变色的字体部分
     */
    private void drawOrigin(Canvas canvas, int middle) {
        drawText(canvas, mOriginPaint, middle, getWidth());
    }

    /**
     * 绘制文本根据指定的位置
     *
     * @param canvas canvas画布
     * @param paint  画笔
     * @param startX 开始的位置
     * @param endX   结束的位置
     */
    private void drawText(Canvas canvas, Paint paint, int startX, int endX) {
        // 保存画笔状态
        canvas.save();
        // 截取绘制的内容,待会就只会绘制clipRect设置的参数部分
        canvas.clipRect(startX, 0, endX, getHeight());
        // 获取文字的范围
        Rect bounds = new Rect();
        mOriginPaint.getTextBounds(mText, 0, mText.length(), bounds);
        // 获取文字的Metrics 用来计算基线
        Paint.FontMetricsInt fontMetrics = mOriginPaint.getFontMetricsInt();
        // 获取文字的宽高
        int fontTotalHeight = fontMetrics.bottom - fontMetrics.top;
        // 计算基线到中心点的位置
        int offY = fontTotalHeight / 2 - fontMetrics.bottom;
        // 计算基线位置
        int baseline = (getMeasuredHeight() + fontTotalHeight) / 2 - offY;
        canvas.drawText(mText, getMeasuredWidth() / 2 - bounds.width() / 2, baseline, paint);
        // 释放画笔状态
        canvas.restore();
    }
}

xml:

<com.youling.youling.ColorTrackTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="呢哈哈哈哈哈哈哈较大幅度"
    />

 

图片 2

 

style=”font-size: 18pt;”>目录

style=”font-size: 14pt;”>1
什么是Django?

style=”font-size: 14pt;”>2
Django框架的开条件搭建

style=”font-size: 14pt;”>3
Django操作MySql数据库简介

style=”font-size: 14pt;”>4
功能强大的Django管理工具应用

2.落实左右差倾向不断变色:

  当一个TextView有了简单栽文字颜色后,我们连下就是不止的主宰时之快mCurrentProgress变量不断的绘图然后给点儿单向为从左到右,从右到左,还将写好的片独颜色值变成从定义之属性,自定义属性应该不要说了咔嚓?我此只有贴发修改部分代码:

// 当前朝向
    private Direction mDirection = DIRECTION_LEFT;
    // 绘制的朝向枚举
    public enum Direction {
        DIRECTION_LEFT, DIRECTION_RIGHT
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // 获取当前文本
        mText = getText().toString();
        // 获取控件宽度
        int width = getWidth();
        if (!TextUtils.isEmpty(mText)) {
            // 根据当前进度计算中间位置
            int middle = (int) (width * mCurrentProgress);

            // 根据不同的朝向去画字体
            if (mDirection == DIRECTION_LEFT) {
                drawOriginDirectionLeft(canvas, middle);
                drawChangeDirectionLeft(canvas, middle);
            }
            if (mDirection == DIRECTION_RIGHT) {
                drawOriginDirectionRight(canvas, middle);
                drawChangeDirectionRight(canvas, middle);
            }
        }
    }

    /**
     * 画朝向右边变色字体
     */
    private void drawChangeDirectionRight(Canvas canvas, int middle) {
        drawText(canvas, mChangePaint, getWidth() - middle, getWidth());
    }

    /**
     * 画朝向左边默认色字体
     */
    private void drawOriginDirectionRight(Canvas canvas, int middle) {
        drawText(canvas, mOriginPaint, 0, getWidth() - middle);
    }

    /**
     * 画朝向左边变色字体
     */
    private void drawChangeDirectionLeft(Canvas canvas, int middle) {
        drawText(canvas, mChangePaint, 0, middle);
    }

    /**
     * 画朝向左边默认色字体
     */
    private void drawOriginDirectionLeft(Canvas canvas, int middle) {
        drawText(canvas, mOriginPaint, middle, getWidth());
    }

    /**
     * 设置当前的进度
     *
     * @param currentProgress 当前进度
     */
    public void setCurrentProgress(float currentProgress) {
        this.mCurrentProgress = currentProgress;
        // 重新绘制
        invalidate();
    }

    /**
     * 设置绘制方向,从右到左或者从左到右
     *
     * @param direction 绘制方向
     */
    public void setDirection(Direction direction) {
        this.mDirection = direction;
    }

连着下我们描绘一个主Activity做一下测试:

public class MainActivity extends AppCompatActivity {

    private ColorTrackTextView mCttv;
    private String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mCttv = (ColorTrackTextView) findViewById(R.id.tv);
    }

    // onClick事件写在了不居中  --> android:onClick="left"
    public void left(View view) {
        // 设置朝向
        mCttv.setDirection(ColorTrackTextView.Direction.DIRECTION_LEFT);
        // 用属性动画来控制,当然也可以用线程去控制
        ObjectAnimator animator = ObjectAnimator.ofFloat(mCttv, "progress", 0, 1);
        animator.setDuration(2000)
                .start();
        // 添加动画的监听,不断的改变当前的进度
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float progress = (float) animation.getAnimatedValue();
                Log.e(TAG, "progress --> " + progress);
                mCttv.setCurrentProgress(progress);
            }
        });
    }

    // 这与上面类似,只是朝向不一样
    public void right(View view) {
        mCttv.setDirection(ColorTrackTextView.Direction.DIRECTION_RIGHT);
        ObjectAnimator animator = ObjectAnimator.ofFloat(mCttv, "progress", 0, 1);
        animator.setDuration(2000)
                .start();
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float progress = (float) animation.getAnimatedValue();
                Log.e(TAG, "progress --> " + progress);
                mCttv.setCurrentProgress(progress);
            }
        });
    }
}

 

图片 3

 

 

3 结合ViewPager:

 

public class MainActivity extends AppCompatActivity {

    private String[] items = {"直播", "推荐", "视频", "图片", "段子", "精华"};
    private LinearLayout mIndicatorContainer;
    private List<ColorTrackTextView> mIndicators;
    private ViewPager mViewPager;
    private String TAG = "ViewPagerActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_pager);
        mIndicators = new ArrayList<>();
        mIndicatorContainer = (LinearLayout) findViewById(R.id.indicator_view);
        mViewPager = (ViewPager) findViewById(R.id.view_pager);
        initIndicator();
        initViewPager();
    }

    /**
     * 初始化ViewPager
     */
    private void initViewPager() {
        mViewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                return ItemFragment.newInstance(items[position]);
            }

            @Override
            public int getCount() {
                return items.length;
            }

            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {

            }
        });

        /**
         * 添加一个切换的监听那个setOnPageChangeListener过时了
         * 这个看源码去吧
         */
        mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, 
                int positionOffsetPixels) {
                Log.e(TAG, "position --> " + position + " positionOffset --> " + positionOffset);
                if (positionOffset > 0) {
                    // 获取左边
                    ColorTrackTextView left = mIndicators.get(position);
                    // 设置朝向
                    left.setDirection(ColorTrackTextView.Direction.DIRECTION_RIGHT);
                    // 设置进度  positionOffset 是从 0 一直变化到 1 不信可以看打印
                    left.setCurrentProgress(1-positionOffset);

                    // 获取右边
                    ColorTrackTextView right = mIndicators.get(position + 1);
                    right.setDirection(ColorTrackTextView.Direction.DIRECTION_LEFT);
                    right.setCurrentProgress(positionOffset);
                }
            }
        });

        // 默认一进入就选中第一个
        ColorTrackTextView left = mIndicators.get(0);
        left.setDirection(ColorTrackTextView.Direction.DIRECTION_RIGHT);
        left.setCurrentProgress(1);
    }

    /**
     * 初始化可变色的指示器
     */
    private void initIndicator() {
        for (int i = 0; i < items.length; i++) {
            // 动态添加颜色跟踪的TextView
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
            params.weight = 1;
            ColorTrackTextView colorTrackTextView = new ColorTrackTextView(this);
            // 设置两种颜色
            colorTrackTextView.setOriginColor(Color.BLACK);
            colorTrackTextView.setChangeColor(Color.RED);
            colorTrackTextView.setText(items[i]);
            colorTrackTextView.setLayoutParams(params);
            // 把新的加入LinearLayout容器
            mIndicatorContainer.addView(colorTrackTextView);
            // 加入集合
            mIndicators.add(colorTrackTextView);
        }
    }
}

 

图片 4

至目前为止应该还是挺简单的,就是移个色而已,有一个讨厌的问题不怕是时下为此的指示器是为此之LinearLayout。我们好去网上查找一个ViewPagerIndicator的源码测试一下,但是本人觉着无是特地好用配备不行辛苦,所以决定使Adapter适配器模式自己去一个车轮。其实自己首写了同样首,下载的食指还发生酷多,可是代码来题目,所以还是抄一意在视频吧,有问题大家可以协调改变一下。

 

 


1 什么是Django?

Django是利用于Web开发的尖端动态语言框架,最初起源于美国芝加哥底Python用户组,具有新闻从业背景的Adrian
Holovaty是Django框架的显要开发者。在Adrian的指引下,Django小组致力为为Web开发者贡献一暂缓快、完美的Python框架,并且以BSD(Berkeley
Software
Distribution,伯克利软件套装)开放源代码协议许可下授权给开发者自由使用。

 

Django拥有完善的模板机制、对象关系映射机制同用于动态创建后台管理界面的功力。使用Django框架来开发Web应用,可以很快设计以及开发具有MVC层次的Web应用。Django框架是于事实上项目面临出生出来的,该框架提供的机能特别吻合给动态网站的建设,特别是管制接口。

 

Django框架作为同一种植高效的大网框架,具有以下特点:

  • l 组件的客观集成
  • l 对象关联映射和大部分数据库支持
  • l 简洁的URL设计
  • l 自动化的管制界面
  • l 强大的开销条件

 

 


2 Django框架的出环境搭建

安装Django框架(PS:此处就简单说明Windows环境下道)

生充斥链接:https://www.djangoproject.com/download/(PS:网页界面及起详尽的设置步骤说明,之所以贴出链接,方便查看时Django框架的时髦版本与相应版本支持之Python版本。楼主写这首文章以Python版本也2.7.14)

开拓CMD输入:pip
install
Django==1.11.7(PS:其中1.11.7表示安装之Django版本。其中pip是管理安装Python相关模板架包之管理工具,如果没有装,请提前装哦。使用pip安装相关模板架包大便宜)

附pip9.0.1下充斥链接:https://pypi.python.org/pypi/pip/9.0.1

图片 5

百度云盘下充斥链接:http://pan.baidu.com/s/1i4PtOzV
密码:dzqe

下载后,解压,cmd中上解压后底到底目录,输入python
setup.py
install(PS:出现下图跟证明安装成功),然后cmd进入Python安装根目录Scripts文件夹,即可使用pip命令安装相应模块和保。

图片 6

 安装完pip后,可以把D:\Program Files
(x86)\Python27
\Scripts(PS:红色字体部分是楼主自己Python安装路径)添加进环境变量path中,即可在cmd中直接用pip命令,例如下图:

图片 7

 

 

翻开服务器

启航Django框架中早已包含的一个轻量级的Web应用服务器。因此,在行使Django框架开发Web项目时,不需再指向其配备服务器,比如针对Apache的布局。(PS:Django框架自带的轻量级Web应用服务器,便于开发过程中测试,性能于逊色,如果想使落高性能,在形成系统出后,重新部署一个服务器,例如使用Apache中Tomcat、Nginx,
lighttpd等)

当CMD中切换至新创建的类目录中,然后于拖欠目录下输入以下命令:manage.py
runserver(PS:此命令,默认开启系统8000端口,如果8000端口被占,可以运用manage.py
runserver 8001运8001端口,或者填写其它数字端口)

 

 


3 Django操作MySql数据库简介

数据库配置

在项目的
settings.py 文件被找到 DATABASES 配置起,将那信息修改也:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 或者使用 mysql.connector.django
        'NAME': 'book',          #连接数据库名称
        'USER': 'root',          #mysql数据库连接用户名
        'PASSWORD': 'root',     #mysql数据库连接密码
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {
              'init_command': "SET sql_mode='STRICT_TRANS_TABLES'" ,
              # 'charset': 'utf8mb4',
        }
    }
}

以下具体操作步骤(具体参考自网上教程:Django
模型
):

创建
APP

Django规定,如果要是利用模型,必须使创建一个app。我们利用以下命令创建一个
TestModel 的 app:

django-admin.py startapp TestModel 

俺们修改
TestModel/models.py 文件,代码如下:

HelloWorld/TestModel/models.py:
文件代码:

# models.py
from django.db import models

class Test(models.Model):
    name = models.CharField(max_length=20)

如上之类名代表了数据库表名,且持续了models.Model,类里的字段代表数量表中的字段(name),数据类型则由CharField(相当给varchar)、DateField(相当给datetime),
max_length 参数限定长度。

通下当settings.py中找到INSTALLED_APPS这一项,如下:

INSTALLED_APPS = (

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    'TestModel',               # 添加此项
)

每当命令行中运行:

$ python manage.py migrate   # 创建表结构

$ python manage.py makemigrations TestModel  # 让 Django 知道我们在我们的模型有一些变更

$ python manage.py migrate TestModel   # 创建表结构

目几实践
“Creating table…” 的字样,你的数据表就创造好了。

Creating
tables ………Creating table TestModel_test  #俺们打定义的申……

表名组成结构为:应用叫_类名(如:TestModel_test)。

小心:尽管我们从不当models给表安装主键,但是Django会自动抬高一个id作为主键。

学科上囊括:添加数量、更新数据、删除数据,具体求参见上述教程链接。

 

 

 


4 功能强大的Django管理工具应用

首先查看管理工具运行效果:

图片 8

 

                         
                                                                   
 希冀1 首页登陆界面,漂亮吧

 

图片 9

                                                                        
                     图2
登陆成功后管理界面,Django框架自带,一行代码搞定

 

图片 10

                                                                       
                      希冀3
操作后台contact实体表,可以展开加、删除、修改及询问

 

实际代码见:https://coding.net/u/LiuZhen1995/p/MyDemo/git/tree/origin_nine/

 

 

参考资料:

1.《Python
Web开发上实录》 李勇 王文强  编著

2.http://www.runoob.com/django/django-tutorial.html

3.https://code.ziqiangxuetang.com/django/django-tutorial.html