Хорошо, у меня есть рабочее решение. Приглашение от Darko заставило меня снова взглянуть на класс ImageView (спасибо) и применил преобразование, используя Matrix (как я подозревал, но не имел успеха при первой попытке!). В моем обычном классе imageView я вызываю setScaleType(ScaleType.MATRIX)
после super()
в конструкторе и имею следующий метод.
@Override
protected boolean setFrame(int l, int t, int r, int b)
{
Matrix matrix = getImageMatrix();
float scaleFactor = getWidth()/(float)getDrawable().getIntrinsicWidth();
matrix.setScale(scaleFactor, scaleFactor, 0, 0);
setImageMatrix(matrix);
return super.setFrame(l, t, r, b);
}
Я поместил int в метод setFrame()
, как в ImageView, вызов configureBounds()
находится внутри этого метода, в котором происходит все масштабирование и материал матрицы, поэтому мне кажется логичным (скажем, если вы не согласны)
Ниже приведен метод super.setFrame () из AOSP
@Override
protected boolean setFrame(int l, int t, int r, int b) {
boolean changed = super.setFrame(l, t, r, b);
mHaveFrame = true;
configureBounds();
return changed;
}
Найти полный класс src здесь
У Chartjs нет публичного API для этого, но вы можете изменить внутренний _ticks
на beforeDraw
и сделать метку «Blue» как major: true
, тогда эта метка будет нарисована с использованием стиль major
в опциях конфигурации тиков.
Также используйте это с осторожностью, поскольку оно опирается на внутреннюю реализацию и, таким образом, может сломаться в будущих выпусках (очень маловероятно, но просто сказать).
var ctx = document.getElementById("myChart").getContext('2d');
var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
datasets: [{
label: '# of Votes',
data: [12, 19, 3, 5, 2, 3],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)',
'rgba(75, 192, 192, 0.2)',
'rgba(153, 102, 255, 0.2)',
'rgba(255, 159, 64, 0.2)'
],
borderColor: [
'rgba(255,99,132,1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
yAxes: [{
ticks: {
beginAtZero:true
}
}],
xAxes: [{
ticks: {
fontSize: 16,
major: {
fontSize: 20
}
}
}]
}
},
plugins: [{
beforeDraw: function({ chart }, options) {
chart.boxes
.find(box => box.id === "x-axis-0")
._ticks
.find(tick => tick.label === "Blue")
.major = true;
}
}]
});
<canvas id="myChart"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.min.js"></script>
PS: На всякий случай, если кому-то интересно, откуда я знаю эту внутреннюю реализацию, я искал fillText
в чарте из источника gjit chartjs код и console.log(myChart)
xD
Похоже, это невозможно в соответствии с их документами. Вы можете сделать что-то вроде метки в верхнем регистре только с помощью функции обратного вызова
xAxes: [{
ticks: {
fontSize: 16,
callback: v => v === 'Blue' ? v.toUpperCase() : v
}
}]
.